어레이[100] = {0}에서 전체 어레이를 0으로 설정하는 방법은 무엇입니까?
요?char array[100] = {0};그뒤뒤 겨겨 ?법? ??? ???
컴파일러가 내부적으로 어떻게 초기화되는지 알고 싶었습니다.
마법이 아니야.
C에서 이 코드의 동작은 C 사양의 섹션 6.7.8.21(C 사양의 온라인 초안)에 설명되어 있습니다.지정된 값이 없는 요소에 대해 컴파일러는 NULL 포인터와 산술 타입을 0으로 초기화합니다(그리고 이것을 집약에 재귀적으로 적용합니다).
C++에서의 이 코드의 동작은 C++ 사양의 섹션 8.5.1.7(C++ 사양의 온라인 초안): 컴파일러는 지정된 값을 가지지 않는 요소를 집약 초기화합니다.
또한 C++에서는 빈 이니셜라이저 목록을 사용할 수 있으므로 컴파일러는 어레이의 모든 요소를 집약 초기화합니다.
char array[100] = {};
이 경우 컴파일러가 생성할 수 있는 코드의 종류에 대해서는 다음 질문을 참조하십시오.어레이 0-초기화에서 이상한 어셈블리
컴파일러가 GCC인 경우 다음 구문을 사용할 수도 있습니다.
int array[256] = {[0 ... 255] = 0};
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits, 를 참조해 주세요.이 기능은 컴파일러 고유의 기능입니다.
이 초기화를 어디에 두느냐에 따라 다릅니다.
어레이가 스태틱한 경우
char array[100] = {0};
int main(void)
{
...
}
프로그램의 데이터 분할에 100 0 바이트를 예약하는 것은 컴파일러입니다.이 경우 이니셜라이저를 생략할 수 있습니다.
어레이가 자동이라면 다른 이야기입니다.
int foo(void)
{
char array[100] = {0};
...
}
이 경우 함수 foo를 호출할 때마다 숨겨진 memset이 생성됩니다.
위의 코드는 다음과 같습니다.
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
이니셜라이저를 생략하면 배열에 랜덤 데이터(스택의 데이터)가 포함됩니다.
로컬 어레이가 다음과 같이 정적인 것으로 선언된 경우
int foo(void)
{
static char array[100] = {0};
...
}
엄밀히 따지면 첫 번째 사건과 같은 경우입니다.
구현은 컴파일러 개발자에게 달려 있습니다.
"이러한 선언으로 어떤 일이 일어날까요?"라고 묻는 경우 컴파일러는 첫 번째 어레이 요소를 지정한 값(0)으로 설정하고 나머지 모든 어레이 요소는 생략된 어레이 요소의 기본값이기 때문에 0으로 설정합니다.
언급URL : https://stackoverflow.com/questions/629017/how-does-array100-0-set-the-entire-array-to-0
'programing' 카테고리의 다른 글
| 스토어 변환 내에서 vuex "state property is read only"를 해결하는 방법 (0) | 2022.07.06 |
|---|---|
| vuex 작업에서 setTimeout을 사용하는 방법 (0) | 2022.07.06 |
| Java에서 hashCode의 용도는 무엇입니까? (0) | 2022.07.06 |
| C기준은 true 값을 0 또는 1로 명시하고 있습니까? (0) | 2022.07.06 |
| 로봇 서비스 방법Vue 앱의 txt (0) | 2022.07.06 |