2011-09-17 8 views
3

배열로 속성을 사용하여 데이터 형식 (이 경우 구조체)을 만들어야합니다. 이 데이터 구조를 초기화하고 배열에 지정된 크기를 제공하는 initialiser 함수가 있습니다. 문제는 이제 struct에 배열을 선언하는 것입니다. 예를 들어 "int values ​​[]"는 괄호 안에 숫자 (예 : values ​​[256])를 입력해야합니다. 구조가 초기화 될 때 Th3 256을 지정해야합니다. 이 문제를 해결할 방법이 있습니까?배열에 변수가있는 구조체

typedef struct 
{ 
     int values[];  //error here 
     int numOfValues; 
} Queue; 

답변

16

구조체는 컴파일시 알려진 고정 크기 여야합니다. 가변 길이의 배열을 원하면 동적으로 메모리를 할당해야합니다.

typedef struct { 
    int *values; 
    int numOfValues; 
} Queue; 

이렇게하면 구조체에 포인터 만 저장됩니다. 그것은 더 이상 사용되지 않는 자마자

Queue q; 
q.numOfValues = 256; 
q.values = malloc(256 * sizeof(int)); 

NULL 포인터 반환 값을 확인하는 기억하고 free() 어떤 동적으로 할당 된 메모리 : 구조체의 초기화에서 당신의 malloc으로 할당 된 메모리 영역에 포인터를 할당 .

8
#include<stdio.h> 
#include<stdlib.h> 
typedef struct Queue { 
int numOfValues; 
int values[0]; 
} Queue_t; 

int main(int argc, char **argv) { 
Queue_t *queue = malloc(sizeof(Queue_t) + 256*sizeof(int)); 
return (1); 
} 

이렇게하면 '가변 길이 배열'을 선언 할 수 있습니다. 그리고 큐 -> 값으로 배열 'values'에 접근 할 수 있습니다. [index]

EDIT : 물론 일단 자유롭게하면 할당 한 'n * sizeof (int)'를 고려해야합니다. 위 예제에서 n = 256 인 sizeof (Queue_t)와 함께 HTH

3

VLA와 같은 C99 기능을 사용할 수 있습니다. 예

int main() 
{ 
    int len=1234; 
    struct MyStruct {int i,array[len];} var; 

    var.array[0]=-1; 
    var.array[len-1]=1; 

    printf("%i %i %lu", var.array[0],var.array[len-1],(unsigned long)sizeof(var)); 

    return 0; 
} 
관련 문제