2013-04-13 6 views
4

C에서는 각 배열이 다른 배열의 배열과 정적으로 미리 할당되어야합니다. 다음과 같은 코드가 트릭을 수행합니까?C 배열의 배열 배열

struct number_and_strings { 
    int nnn; 
    char **sss; 
} 

static struct number_and_strings my_list[] = { 
    {12, {"apple","banana","peach","apricot","orange",NULL}}, 
    {34, {"tomato","cucumber",NULL}}, 
    {5, {"bread","butter","cheese",NULL}}, 
    {79, {"water",NULL}} 
} 
+2

시험 사용해 보지 마세요. –

+1

내가 두려워하는 것은 작동하는 것처럼 보이지만 포인터의 오해로 인해 나는 꿀꺽 거리거나 새어 난 기억을 끝내게 될 것이다. –

+0

포인터는 데이터 세그먼트의 메모리 위치를 가리 킵니다. 거기에 누출 없음. –

답변

5

sss은 포인터입니다. 따라서 포인터 배열을 직접 할당 할 수는 없습니다. 복합 리터럴 (C99 기능)을 사용하여 다음과 같이 할당 할 수 있습니다.

static struct number_and_strings my_list[] = { 
     {12, (char*[]){"apple","banana","peach","apricot","orange",NULL}}, 
     {34, (char*[]){"tomato","cucumber",NULL}}, 
     {5, (char*[]){"bread","butter","cheese",NULL}}, 
     {79, (char*[]){"water",NULL}} 
    }; 
+0

이것은 캐스트는 아니지만 상당히 다른 내용, 즉 복합 리터럴입니다. (이름없는 객체에 대한 C 전문 용어 및 구문) –

+0

ANSI C에서 작동하는 것과 유사한 것은 무엇입니까? –

+0

@FreeBud 아니요, AFAIK C89/90은이 기능을 지원하지 않습니다 (그러나 gcc는이를 확장 기능으로 지원합니다). C99 모드로 컴파일하면 괜찮을 것입니다. 예를 들어, gcc를 사용한다면,'gcc -std = c99 file.c'. –