2012-01-05 2 views
27

미안하지만 난 무엇홀수 사용

... 핵심 오디오에서 책을 읽고 휴가 중이, 내 C 또는 저와 목표 C 책이 없습니다 이 변수 정의에서 중괄호는 무엇입니까? C99 표준에 따라 0recorder 구조의 모든 멤버를 초기화

MyRecorder recorder = {0}; 
+16

수 웨일. 필요한 경우 모든 유형에 대해 반복적으로 "작동"합니다! ints, double, structs, 배열, 포인터, 구조체에 대한 포인터, 포인터 배열에 대한 구조체 ... – pmg

+2

pmg : 답변으로 게시하십시오! –

+1

@pmg - 답변으로 의견을 게시하지 않은 이유는 무엇입니까? – vikingosegundo

답변

22

, MyRecorderstruct 있음 (포인터 등을위한 정수의 0, NULL)이 sets every member to their respective representation of zero 가정.

사실이 있습니다 (이 지적에 대해 PMG 덕분에!) int는, double는, 포인터, 배열, 중첩 된 구조, ..., 모든 것을 당신이 상상할 수있는 등의 다른 모든 데이터 유형에서 작동

UPDATE를 : C99의 최종 초안을 인용 한 위의 링크 된 웹 사이트에서 추출한 인용 :

[6.7.8.21] 집합의 요소 또는 구성원이보다 중괄호로 둘러싸인 목록 적은 이니셜 라이저가있는 경우, [ ...] 나머지는 집합은 암시 적으로 에 정적 저장소 기간이있는 개체와 동일하게 초기화되어야합니다.

+0

구조체 멤버에는 기본값이 없습니다. 명시 적으로 0이라고 말하는 것이 좋습니다. "모든 멤버를 (올바른 종류의) 0으로 설정합니다." – pmg

+0

@pmg : 고마워,이 문제가 해결되었습니다. –

+0

아! 시원한. 그건 의미가 있습니다. 감사. – John

9

그것. 0 비트로 구조의 모든 비트를 초기화하는 것처럼 보일 수 있습니다. 하지만 모든 컴파일러에는 해당되지 않습니다.

#include<stdio.h> 

struct s { 
    int i; 
    unsigned long l; 
    double d; 
}; 

int main(){ 
    struct s es = {0}; 
    printf("%d\n", es.i); 
    printf("%lu\n", es.l); 
    printf("%f\n", es.d); 
    return 0; 
} 

는 출력이 예제 코드를 참조하십시오.

$ ./a.out 
0 
0 
0.000000 
+1

"레코더 구조의 모든 구성원을 0으로 초기화합니다." C99 표준을 적용합니다. "사실 0 비트로 구조의 모든 비트를 초기화합니다." C99 표준은 여러 번 지적한다. 사실이라고 말하는 것은 아니며, 표준을 따르는 컴파일러/타겟 아키텍처가 사실이 될 필요는 없다. –

+0

@Complicatedseebio 감사합니다. 답변을 업데이트했습니다. –

3
+1

도 스칼라 일 수 있습니다 :'MyRecorder recorder = {0};'MyRecorder'는'int'의 별칭입니다. 예를 들어 C에서 유효합니다 – ouah

+1

@ouah'struct '의 이름으로 판단하면됩니다. 'int'또는 실제로 구조체/합집합 이외의 것임을 알 수 있습니다. – dasblinkenlight

0

MyRecorder은 다음 중 하나가 될 수있는 당신은 사실, 최초의 단지 구조의 모든 요소를, initliaze하지 않는 제로

typedef struct _MyRecorder1 { 
    int i; 
    int j; 
    int k; 
}MyRecorder1; 

typedef int MyRecorder2[3]; 
3

와 그 모든 요소를 ​​초기화하려고합니다 하나. 그러나 다른 것들은 C 표준이 요구하는 것이기 때문에 자동으로 0으로 초기화됩니다.

넣을 경우 : MyRecorder 기록기 = {3};

*** 첫 번째 요소는 3되며 나머지는 내가`{0}`는 *** 보편적 제로 초기화를 호출처럼 0