programing

어레이[100] = {0}에서 전체 어레이를 0으로 설정하는 방법은 무엇입니까?

prostudy 2022. 7. 6. 20:37
반응형

어레이[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

반응형