2012-05-19 3 views
2

여기 내 코드의 일부입니다. 만 arraylist[0].x = 0arraylist[0].y = 0으로 초기화하고 싶습니다. 구조체 배열의 나머지 부분을 초기화 할 필요가 없습니다. 내가 어떻게 해? 고맙습니다. 당신이 구조체/배열의 일부를 초기화하면C에서 struct 배열 초기화

#include <stdio.h> 
struct example { 
    int x; 
    int y; 
}; 
struct example arraylist[40]; 

int main(int argc, char *argv[]){ 
    printf("%d\n %d\n", arraylist[0].x, arraylist[0].y); 
    return 0; 
} 
+0

AFAIK 현재의 C 표준에서는 불가능합니다. C++에는 그것을 수행하는 방법이 있습니다. –

+0

요소의 나머지 부분을 초기화 할 필요는 없지만 실제로 요소를 초기화하는 것이 쉽지는 않습니다. –

답변

5

구조체 배열의 특정 요소를 초기화 할 수 있습니다. 예를 들어

는 :

struct example arraylist[40] = { [0]={0,0}}; //sets 0th element of struct 

struct example arraylist[40] = { [5]={0,0}}; //sets 6th element of struct 

이 C99 그것을 적응 또한 C99 이후 표준 C에서 지원되기 전에 GNU 확장자로 사용 Designated Initializers 불린다.

+4

그러나 일단 개체의 일부에 대해 초기화 프로그램이 있으면 전체 개체가 초기화됩니다 ("0"적절한 형식으로). – caf

+1

이것은 gnu 확장이 아니고 C99 (및 C11)의 일부입니다. Gcc는 이것을 C89 모드에서도 사용할 수있는 확장 기능을 가지고 있습니다. –

+0

동의합니다. 이것은 '유형에 대해'뿐만 아니라 초기화되지 않은 값에 액세스하는 것이 어쨌든 해결되지 않을 것 인 모든 값을 설정하는 데 유용합니다. –

1

는 C에서, 당신은 당신이 처음에 초기화되지 않은 변수에 액세스하지 말아야과 같이, 그와 아무 문제가 없어야합니다 0

와 그것의 나머지를 초기화 장소와 그 값이 정의되지 않았습니다.

+0

AFAIR, C++에서도 마찬가지입니다. –

1

C 모두 정적 및 extern 변수는 명시 적으로 초기화되지 않는 한 0으로 초기화됩니다.

+0

... 그렇지 않으면 초기화되지 않은 경우 :) –

+0

명시 적으로 다르게 초기화 할 수 있도록 수정되었습니다. 고맙습니다. – kmkaplan

2

파일 범위의 변수에 대해 이야기하고 있으므로 여기에서는 명시적인 이니셜 라이저를 제공하지 않으면 이러한 변수가 항상 0에 의해 초기화되므로 아무 것도 할 필요가 없습니다.