2016-10-07 5 views
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 그들을 부르 자? 정의되지 않은 동작에 숨어 있습니까?

답변

0

이렇게하는 한 가지 방법은 유연한 배열 대신 포인터 멤버를 사용하는 것입니다. 그런 다음 malloc() 등을 통해 수동으로 크기를 할당해야합니다. al. []는 대개 배열이 선언시 초기화 될 때만 사용됩니다. struct는 기본적으로 선언이 아닌 정의이므로 가능하지 않습니다. struct 유형의 인스턴스를 즉시 선언하는 기능은 정의의 본질을 변경하지 않으며 단지 편의를위한 것입니다.

typedef struct { 
    int foo; 
    float* bar; } swfam_t; // struct with FAM