2014-04-14 7 views
1

저는 C 언어를 배우기 시작했으며 구조체 배열을 초기화하는 데 어려움을 겪고 있습니다. 기본적으로 높은 목표는 mustache template과 같은 문자열을 가져 와서 배열에 저장된 "정적 문자열"또는 "변수"토큰으로 분리하는 것입니다. 그런 다음 이론적으로 배열을 렌더링하려면 "문자열인지, 문자열을 복사하고, 그렇지 않으면 변수를 가져 와서 값을 가져 와서 문자열에 추가하십시오."를 확인하십시오. 첫 번째 단계의C에서 동적 구조체 배열을 어떻게 초기화합니까?

그래서 하나는 여기에, 단지 토큰의 임의의 수를 처리 할 수있는 배열을 초기화하는 것입니다 내가 시도하고있는 작업은 다음과 같습니다

typedef struct { 
    int *type; // probably pointing to an enum or something, but not there yet 
    char *value; 
} token; 

typedef struct { 
    // token *tokens[] // how to do this? 
} template; 

template 
compile(char *source) { // source string 
    token tokens[] = malloc(sizeof(token) * 20) // 20 is arbitrary max 
    // ... rest of code 
} 

그래서 token tokens[] 2 곳이있다. 이것을 어떻게 써야합니까? 내가 참조를 시도하는 경우에 상관없이이 오류가 발생하거나 아무 참고 계속 :

error: array initializer must be an initializer list 
    token tokens[] = malloc(sizeof(tokens)); 

그냥 내가 C에서 볼,주의해야 할 ++이 벡터 클래스,하지만 난 그냥 똑바로 C.

답변

2
에서이 작업을 수행 할 수

당신은

typedef struct { 
    token* tokens; 
} template; 

t.tokens = malloc(sizeof(token)*20); 

token* tokens[20] 당신에게 토큰 20 포인터의 배열을 줄 것이다 할 수 있습니다. 20 개의 토큰 목록이 필요할 때 유용합니다. 하지만 귀하의 질문에 나는 당신이 단 하나의 목록을 ok 토큰 만 원한다고 가정하므로 token* tokens을 사용하십시오.

대안이다

첫번째 접근법에서
typedef struct { 
    token tokens[20]; // now you don't need malloc at all! 
} template; 

, 토큰의 수가 동적 런타임들 수있다. 두 번째 버전의 경우 컴파일시 토큰의 최대 개수를 알아야합니다.