source

Flexible Array 멤버가 구조 오류 끝에 있지 않은 원인은 무엇입니까?

nicesource 2023. 7. 23. 14:22
반응형

Flexible Array 멤버가 구조 오류 끝에 있지 않은 원인은 무엇입니까?

왜 자꾸 전화가 오는지 궁금합니다.error: flexible array member not at end of structmalloc에 전화할 때 오류가 발생했습니다.가변 길이 배열을 가진 구조체가 있는데 이 오류가 계속 발생합니다.

구조는,

typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 

말로키스에게 전화를 걸었는데,

col = malloc(sizeof(s_col) + lc * (sizeof(double) + sizeof(int)));

이것이 malloc에 대한 정확한 전화입니까?

구조체에는 하나의 유연한 배열 멤버만 있을 수 있으며 항상 구조체의 마지막 멤버여야 합니다.다시 말해서, 이 경우에는 전화하기 전에 잘못한 것입니다malloc전화할 방법이 없을 정도로malloc이 구조체에 대해 정확하게.

원하는 것처럼 보이는 작업 수행(동일한 수의 배열)data그리고.label멤버), 다음과 같은 것을 고려할 수 있습니다.

struct my_pair { 
    double data;
    int label;
};

typedef struct { 
   size_t N;
   struct my_pair data_label[];
};

그러나 이것은 다소 다르다는 것을 유의하십시오: 배열 대신doubles 뒤에 일련의ints, 그것은 당신에게 하나의 배열을 제공합니다.double다음에 하나int그 다음에double,다음 분.int등등.이 값이 동일한 값에 충분히 가까운지 여부는 데이터를 사용하는 방법에 따라 달라집니다(예: 연속 배열을 예상하는 외부 함수로 전달하는 경우에는 작업을 다르게 수행해야 할 수도 있습니다).

구조체 정의와 구조체의 시작에 대한 포인터를 고려할 때, C 컴파일러는 다른 어떤 것에도 접근할 필요 없이 구조체의 어떤 멤버에도 접근할 수 있어야 합니다.구조물 내 각 항목의 위치는 이전 항목의 수와 유형에 따라 결정되므로, 모든 항목에 액세스하려면 이전 항목의 수와 유형을 알아야 합니다.마지막 항목이 배열인 경우, 배열의 항목에 액세스하려면 시작 위치(배열 자체의 항목 수가 아니라 이전 항목의 수와 유형을 알아야 함)와 항목 인덱스(컴파일러가 다음보다 작다고 가정할 수 있음)를 알아야 하기 때문에 이는 특별한 어려움이 없습니다.배열 크기에 대해 아무것도 알 필요 없이 공간이 존재하는 항목 수).그러나 Flexible Array Member가 구조체의 끝이 아닌 다른 곳에 나타나는 경우, 그 뒤를 따르는 항목의 위치는 배열의 항목 수에 따라 달라지는데, 이는 컴파일러가 알 수 없는 것입니다.

typedef struct {
  size_t N;
  double data[];
  int label[];
} s_col; 

Flexible member( 어레이 멤버)는수 .double data[] 에. 또는 하드코드 배열 크기를 고려합니다.double *data

언급URL : https://stackoverflow.com/questions/11180378/what-is-the-cause-of-flexible-array-member-not-at-end-of-struct-error

반응형