구조체를 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
)는, 실제로 매우 잘 최적화하고 있습니다.이것은 모든 제로 값(늘 포인터와 부동소수점 제로 포함)이 모두 제로 비트로 표시되는 경우에만 기능합니다.이것은 내가 알고 있는 모든 플랫폼에서 해당됩니다(단, C 표준에서는 이것이 false일 경우 구현이 허용됩니다.그런 구현은 없습니다).
코드도 쓸 수 있고myStruct m = {};
또는myStruct m = {0};
(의 첫 번째 멤버가myStruct
스칼라가 아닙니다).
제 느낌은...memset
로컬 구조가 가장 적합하며 런타임에 어떤 작업을 수행해야 한다는 사실을 더 잘 전달한다(일반적으로 글로벌 데이터와 정적 데이터는 런타임에 비용을 들이지 않고 컴파일 시에 초기화된 것으로 이해할 수 있습니다.
나도 이게 효과가 있을 줄 알았는데 오해의 소지가 있다.
myStruct _m1 = {0};
내가 이걸 해봤을 때:
myStruct _m1 = {0xff};
첫 번째 바이트만 다음과 같이 설정되었습니다.0xff
나머지 1개는 로 설정되어 있습니다.0
그래서 이걸 쓰는 버릇이 생기지 않게 하려고요.
§ 6.7.9 초기화 참조:
21 괄호로 둘러싸인 리스트 내의 이니셜라이저가 애그리게이트의 요소 또는 멤버의 수보다 적거나, 기존의 크기의 배열을 초기화하기 위해 사용되는 문자열 리터럴 내의 문자가 어레이 내의 요소보다 적을 경우, 애그리게이트의 나머지 부분은 정적 기억시간을 갖는 객체와 암묵적으로 동일하게 초기화되어야 한다.
네, 둘 다 효과가 있습니다.C99 에서는, Designated Initialization 이라고 불리는 새로운 초기화 방법을 사용할 수도 있습니다.
myStruct _m1 = {.c2 = 0, .c1 = 1};
언급URL : https://stackoverflow.com/questions/11152160/initializing-a-struct-to-0
'programing' 카테고리의 다른 글
Vue.js - 입력, v-model 및 계산된 속성 (0) | 2022.06.20 |
---|---|
vuex 모듈 내에서 작업/변화를 청취합니다. (0) | 2022.06.19 |
Android 빌드스크립트 저장소: jcenter VS mavencentral (0) | 2022.06.19 |
글로벌 스토어를 가져올 때 getter의 일부만 조롱합니다. (0) | 2022.06.19 |
Java에서 클래스를 매개 변수로 전달하려면 어떻게 해야 합니까? (0) | 2022.06.19 |