2014-10-09 3 views
1

구조체의 요소를 어떻게 초기화 할 수 있습니까?구조체 C에서 변수 행렬 초기화하기

typedef struct { int mat[x][x]; int res; } graphe; 
graphe g; 

내가이 작업을 기다리고 있었다 : :이 구조체가

g.mat = {{0, 1}, {1, 0}, {1, 1}, {0, 1}}; 

을하지만 그렇지 않습니다.

+0

"작동하지 않는 것"에 대해 자세히 설명해야합니다. – 0x499602D2

+0

'g.mat = {{{{0}}, {1, 0}, {1, 1}, {0, 1}}}; 즉, 배열을 초기화하는 다른 중괄호 집합입니다. – 0x499602D2

+0

할당 및 초기화는 C의 다른 개념입니다. 초기화하지는 않지만 할당하는 것입니다. –

답변

2

주된 문제점은 배열을 할당 할 수 없으며 g.mat을 설정할 때까지 이미 초기화 된 것입니다. 시도중인 것은 으로 기존 인스턴스의 구성원에 값을 지정하는 것입니다. 덜 문제는 누락 된 중괄호입니다.

대신

기본-초기화 g을 한 다음 회원에 대해 원하는 값으로에게 graphe 객체를 초기화 할 수 있습니다, 회원들에게 값을 할당 를 시도 :

graphe g = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}}; 

이 또한 암시 적으로 초기화합니다 g.res ~ 0이지만 특정 값으로 초기화 할 수도 있습니다.

graphe g = {{{0, 1}, {1, 0}, {1, 1}, {0, 1}}, 42}; 

다음은 designated initializers을 사용한 예입니다. 이것은 앞의 예보다 쉽게 ​​읽을 수 있습니다, 당신은 필드의 순서를 변경할 수 있습니다 : @의 juanchopanza의 대답에서와 같이, 정의의 시점에서

graphe g = { .mat = {{0, 1}, {1, 0}, {1, 1}, {0, 1}}, .res = 42}; 
+0

감사합니다. 감사합니다. –

1

당신은 초기화 할 수 있습니다 당신의 g을.

그러나, 당신은 또한 는 C 언어

g = (graphe) { { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }, 42 }; 

주의 화합물 문자 기능과 함께 유사한 구문을 사용하여 (필요할 경우) 나중에 g에 새 값을 할당 할 수 할당 연산자는 전체 struct 객체에 대해서만 작동합니다. g.mat 배열에만 새 값을 할당하고 g의 다른 필드는 건드리지 않으려면 C의 배열을 할당 할 수 없으므로 할당 연산자가 해당 용도로 작동하지 않습니다. 그러나 여전히이 당신이 당신의 질문을하려고 노력 무엇을 실제로 g.mat

memcpy(g.mat, (int [x][x]) { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 0, 1 } }, sizeof g.mat); 

에 새로운 값을 복사하는 화합물 문자와 함께 memcpy을 사용할 수 있습니다.