답변:
첫 번째 방법이 가장 쉽고 ( 타이핑이 적음 ) 작동이 보장되며 모든 멤버가 0[Ref 1] 로 설정됩니다 .
두 번째는 더 읽기 쉽습니다.
선택은 사용자 기본 설정 또는 코딩 표준에서 요구하는 항목에 따라 다릅니다.
[참조 1] 참조 C99 표준 6.7.8.21 :
중괄호로 묶인 목록의 이니셜 라이저가 집계의 요소 또는 멤버보다 적거나 알려진 크기의 배열을 초기화하는 데 사용되는 문자열 리터럴의 문자가 배열의 요소보다 적 으면 집계의 나머지는 다음과 같아야합니다. 정적 저장 기간이있는 객체와 동일하게 암시 적으로 초기화됩니다.
좋은 읽기 :
C 및 C ++ : 자동 구조의 부분 초기화
foo = {0}뜻 인지 이미 알고 있습니다. 내가 봤다면 foo = ZERO_FULLZERO_FULL의 정의에 대해 grep해야합니다.
데이터가 정적 또는 전역 변수 인 경우 기본적으로 0으로 채워 지므로 선언하기 만하면됩니다. myStruct _m;
데이터가 로컬 변수 또는 힙 할당 영역 인 경우 다음과 memset같이 지 웁니다 .
memset(&m, 0, sizeof(myStruct));
현재 컴파일러 (예 :의 최신 버전 gcc)는 실제로이를 매우 잘 최적화합니다. 이것은 모든 0 값 (널 포인터 및 부동 소수점 0 포함)이 모두 0 비트로 표시되는 경우에만 작동하며, 이는 내가 아는 모든 플랫폼에서 참입니다 (그러나 C 표준은 이것이 거짓 인 구현을 허용합니다. 그런 구현은 알지 못합니다) .
myStruct m = {};또는 myStruct m = {0};(첫 번째 멤버 myStruct가 스칼라가 아닌 경우에도) 또는 코드를 작성할 수 있습니다.
내 느낌은 memset로컬 구조 를 사용 하는 것이 가장 좋으며 런타임에 무언가를 수행해야한다는 사실을 더 잘 전달한다는 것입니다 (일반적으로 전역 및 정적 데이터는 런타임에 비용없이 컴파일 타임에 초기화 된 것으로 이해할 수 있음). .
0하는 것이 모든 구조체 멤버를 초기화하는 것과 동일 하다는 보장은 없습니다 0. 많은 플랫폼에서 이것은 사실이지만 보편적 인 것은 아닙니다.
{}이 유효한 C가 아니지만 C ++에서만 사용할 수 있습니다.
NULL모든 0비트 가 아닌 포인터 가있는 플랫폼 목록이 있습니다 . c-faq.com/null/machexamp.html . 그리고 플랫폼이 부동 소수점 값을 나타 내기 위해 IEEE 754를 사용하지 않고 모든 0비트 0.0값을 갖지 않는 다른 표현을 사용하고있을 가능성이 있습니다. 하지만 저는 그러한 플랫폼에 대해 알고 있습니다.
§6.7.9 초기화 참조 :
21 중괄호로 묶인 목록의 이니셜 라이저가 집계의 요소 또는 멤버보다 적거나 알려진 크기의 배열을 초기화하는 데 사용되는 문자열 리터럴의 문자가 배열에있는 요소보다 적은 경우 집계의 나머지 정적 저장 기간을 가진 객체와 동일하게 암시 적으로 초기화됩니다.
네, 둘 다 작동합니다. C99에서는 지정된 초기화라고하는 새로운 초기화 방법도 사용할 수 있습니다.
myStruct _m1 = {.c2 = 0, .c1 = 1};
= {};있지만 이것이 유효한지 확실하지 않습니다.