2014-01-31 8 views
3

코드가 아래와 같습니다. 의 * '로 표시된 라인에, 나는 얻을 : 포인터에 대한 포인터의 동적으로 할당 된 "이중 배열을"초기화 컴팩트 한 방법구조체 배열의 배열을 초기화 할 때 '{'토큰 앞에 표현식이 필요합니다.

error: expected expression before ‘{’ token 
rval.adj_list[0] = { {"B","C",3},{"B","A",2} }; 

있습니까?

struct node; 

struct edge { 
    char *from; 
    char *to; 
    int weight; 
}; 

struct digraph { 
    char **vertices; 
    struct edge **adj_list; 
}; 

int main(int argc, char *argv[]) { 
    struct digraph rval; 
    int size = 5; 
    rval.vertices = malloc(size * sizeof(char*)); 
    rval.adj_list = malloc(size * sizeof(struct edge*)); 
    rval.vertices[0] = "A"; 
    rval.adj_list[0] = { {"A","B",2},{"A","E",1} }; //******** 
    rval.vertices[1] = "B"; 
    rval.adj_list[1] = { {"B","C",3},{"B","A",2} }; //******** 
    rval.vertices[2] = "C"; 
    rval.vertices[3] = "D"; 
    rval.vertices[4] = "E"; 
} 
+0

무엇인가'rval.vertices = malloc에 ​​(크기 *의를 sizeof (숯불 *)를);'? 여기서'char *'는 필요한 포인터가 아니라 길이입니다. – herohuyongtao

+0

'char *'는 포인터가 아니라 배열입니다. 배열은'= {data}; '로 초기화 될 수 있지만 할당되지는 않습니다. '= {data}'를 포인터에 할당하려고 시도하고 있는데, 이는 그것들을 모두 위반합니다. –

답변

3

당신은 중괄호의 초기화 다음 캐스트처럼 보이는 C99 '화합물 문자'를 필요 했어.

#include <stdlib.h> 

struct node; 

struct edge { 
    char *from; 
    char *to; 
    int weight; 
}; 

struct digraph { 
    char **vertices; 
    struct edge **adj_list; 
}; 

int main(void) 
{ 
    struct digraph rval; 
    int size = 5; 
    rval.vertices = malloc(size * sizeof(char*)); 
    rval.adj_list = malloc(size * sizeof(struct edge*)); 
    rval.vertices[0] = "A"; 
    rval.adj_list[0] = (struct edge[]){ {"A","B",2}, {"A","E",1} }; 
    rval.vertices[1] = "B"; 
    rval.adj_list[1] = (struct edge[]){ {"B","C",3}, {"B","A",2} }; 
    rval.vertices[2] = "C"; 
    rval.vertices[3] = "D"; 
    rval.vertices[4] = "E"; 
} 
+0

+1 다시 투표 할 수 있기를 바랍니다. 이것은 사람들이 인정하는 것보다 더 자주 나타나며 대개 어떻게 해야할지 모르는 사람들은 종종 중간자 솔루션을 해킹합니다. – WhozCraig

+0

한가지는 나를 벗어난다. 복합 리터럴 * 및 * 구조 정의의 유형은 모두'const'이어야합니다. 그렇지 않아야합니까? 나는 그것이 중요하다고 생각할 것이다. (그리고 나는 항상 그런 식으로한다.) 그러나 나는 그들이 여기에 없다는 것을 알아 차렸다. 그냥 궁금해서. – WhozCraig

+0

'const' 한정자의 올바른 조합을 만들 수 있다면 내 손님이 대답을 끝내도록하십시오. 그것들을 추가하는 것은 사소하지 않습니다. 'adjlist' 요소 자체는 쓰기 가능해야합니다. 포인터가 가리키는 배열 및 배열의 ​​각 요소가 가리키는 항목은 엄격하게 수정할 수 없습니다. –

2

당신은 C99 모드에서 전체 구조가 (struct edge[])하여 이전 초기화 할 수 있습니다 :

rval.adj_list[0] = (struct edge []){ {"A","B",2},{"A","E",1} }; 

이에 연결됩니다. 그렇지 않으면 그 자체로 각 멤버를 초기화해야합니다 :

rval.adj_list[0] = (struct edge[]){ {"A","B",2}, {"A","E",1} }; 
... 
rval.adj_list[1] = (struct edge[]){ {"B","C",3}, {"B","A",2} }; 

또는 :

rval.vertices[0] = "A"; 
rval.adj_list[0][0].from = "A"; 
rval.adj_list[0][0].to = "B"; 
rval.adj_list[0][0].weight = 2; 
rval.adj_list[0][1].from = "A"; 
rval.adj_list[0][1].to = "E"; 
rval.adj_list[0][1].weight = 1; 
rval.vertices[1] = "B"; 
rval.adj_list[1][0].from = "B"; 
rval.adj_list[1][0].to = "C"; 
rval.adj_list[1][0].weight = 3; 
rval.adj_list[1][1].from = "B"; 
rval.adj_list[1][1].to = "A"; 
rval.adj_list[1][1].weight = 2; 
관련 문제