구조체를 0으로 초기화
다음과 같은 구조체가있는 경우 :
typedef struct
{
unsigned char c1;
unsigned char c2;
} myStruct;
이 구조체를 0으로 초기화하는 가장 쉬운 방법은 무엇입니까? 다음으로 충분할까요?
myStruct _m1 = {0};
또는 각 멤버를 명시 적으로 0으로 초기화해야합니까?
myStruct _m2 = {0,0};
첫 번째 방법이 가장 쉽고 ( 타이핑이 적음 ) 작동이 보장되며 모든 멤버가 0
[Ref 1] 로 설정됩니다 .
두 번째는 더 읽기 쉽습니다.
선택은 사용자 기본 설정 또는 코딩 표준에서 요구하는 항목에 따라 다릅니다.
[참조 1] 참조 C99 표준 6.7.8.21 :
중괄호로 묶인 목록의 이니셜 라이저가 집계의 요소 또는 멤버보다 적거나 알려진 크기의 배열을 초기화하는 데 사용되는 문자열 리터럴의 문자가 배열의 요소보다 적 으면 집계의 나머지는 다음과 같아야합니다. 정적 저장 기간이있는 객체와 동일하게 암시 적으로 초기화됩니다.
좋은 읽기 :
C 및 C ++ : 자동 구조의 부분 초기화
데이터가 정적 또는 전역 변수 인 경우 기본적으로 0으로 채워 지므로 선언하기 만하면됩니다. myStruct _m;
데이터가 로컬 변수 또는 힙 할당 영역 인 경우 다음과 memset
같이 지 웁니다 .
memset(&m, 0, sizeof(myStruct));
현재 컴파일러 (예 :의 최신 버전 gcc
)는 실제로이를 매우 잘 최적화합니다. 이것은 모든 0 값 (널 포인터 및 부동 소수점 0 포함)이 모두 0 비트로 표시되는 경우에만 작동하며, 이는 내가 아는 모든 플랫폼에서 참입니다 (그러나 C 표준은 이것이 거짓 인 구현을 허용합니다. 그런 구현은 알지 못합니다) .
myStruct m = {};
또는 myStruct m = {0};
(첫 번째 멤버 myStruct
가 스칼라가 아닌 경우에도) 또는 코드를 작성할 수 있습니다.
내 느낌은 memset
로컬 구조 를 사용 하는 것이 가장 좋으며 런타임에 무언가를 수행해야한다는 사실을 더 잘 전달한다는 것입니다 (일반적으로 전역 및 정적 데이터는 런타임에 비용없이 컴파일 타임에 초기화 된 것으로 이해할 수 있음). .
§6.7.9 초기화 참조 :
21 중괄호로 묶인 목록의 이니셜 라이저가 집계의 요소 또는 멤버보다 적거나 알려진 크기의 배열을 초기화하는 데 사용되는 문자열 리터럴의 문자가 배열에있는 요소보다 적은 경우 집계의 나머지 정적 저장 기간을 가진 객체와 동일하게 암시 적으로 초기화됩니다.
네, 둘 다 작동합니다. C99에서는 지정된 초기화라고하는 새로운 초기화 방법도 사용할 수 있습니다.
myStruct _m1 = {.c2 = 0, .c1 = 1};
참고 URL : https://stackoverflow.com/questions/11152160/initializing-a-struct-to-0
'IT박스' 카테고리의 다른 글
jQuery-요소에 클래스가있는 경우이를 수행 (0) | 2020.08.18 |
---|---|
다른 git repo 안에 git repo 유지 (0) | 2020.08.18 |
JdbcTemplate queryForInt / Long은 Spring 3.2.2에서 더 이상 사용되지 않습니다. (0) | 2020.08.18 |
SQL Server에서 Active Directory 사용자 그룹을 로그인으로 추가하는 방법 (0) | 2020.08.18 |
Neo4j에서 데이터베이스를 삭제 / 생성하는 방법은 무엇입니까? (0) | 2020.08.17 |