0
가변 배열 멤버가있는 구조체 배열을 사용할 수 없습니다.가변 배열 멤버가있는 구조체의 배열로 사용되는 범용 char 버퍼
이것은 TL : this question입니다. 그것에 대해 생각하면, 그것은 완벽하게 이해됩니다.
#include <assert.h>
#include <stdlib.h>
typedef struct {
int foo;
float bar[];
} swfam_t; // struct with FAM
typedef struct { // this one also has a FAM but we could have used a char array instead
size_t size, // element count in substruct
count; // element count in this struct
char data[];
} swfam_array_t;
#define sizeof_swfam(size) (sizeof(swfam_t) + (size_t)(size) * sizeof(float))
swfam_array_t *swfam_array_alloc(size_t size, size_t count) {
swfam_array_t *a = malloc(sizeof(swfam_array_t) + count * sizeof_swfam(size));
if (a) {
a->size = size;
a->count = count;
}
return a;
}
size_t swfam_array_index(swfam_array_t *a, size_t index) {
assert(index < a->count && "index out of bounds");
return index * sizeof_swfam(a->size);
}
swfam_t *swfam_array_at(swfam_array_t *a, size_t index) {
return (swfam_t *)&a->data[swfam_array_index(a, index)];
}
int main(int argc, char *argv[]) {
swfam_array_t *a = swfam_array_alloc(100, 1000);
assert(a && "allocation failed");
swfam_t *s = swfam_array_at(a, 42);
s->foo = -18; // do random stuff..
for (int i = 0; i < 1000; ++i)
s->bar[i] = (i * 3.141592f)/s->foo;
free(a);
return 0;
}
트릭 유효 C99/C11인가 그러나
, 하나 가 유연한 배열 멤버 구조체의 배열을 시뮬레이션 할 수 있습니다 - 의 아래 크기 고정 -의이 swfam 그들을 부르 자? 정의되지 않은 동작에 숨어 있습니까?