[c++] array [100] = {0}은 어떻게 전체 배열을 0으로 설정합니까?

컴파일러는 어떻게 값을 채우 char array[100] = {0};나요? 그 뒤에 마법은 무엇입니까?

내부적으로 컴파일러가 초기화되는 방법을 알고 싶었습니다.



답변

마법이 아닙니다.

C에서이 코드의 동작은 C 스펙의 6.7.8.21 섹션 ( C spec의 온라인 초안)에 설명되어 있습니다. 지정된 값이없는 요소의 경우 컴파일러는 NULL에 대한 포인터를 초기화하고 산술 유형은 0 ( 재귀 적으로 이것을 집계에 적용합니다).

C ++에서이 코드의 동작은 C ++ 사양의 8.5.1.7 ( C ++ spec 온라인 초안) 섹션에 설명되어 있습니다 . 컴파일러는 지정된 값이없는 요소를 집계 초기화합니다.

또한 C ++ (C는 아님)에서 빈 초기화 목록을 사용하여 컴파일러가 배열의 모든 요소를 ​​집계 초기화 할 수 있습니다.

char array[100] = {};

이 작업을 수행 할 때 컴파일러가 생성 할 수있는 코드 종류에 대해서는 다음 질문을 살펴보십시오. 배열 0 초기화의 이상한 어셈블리


답변

구현은 컴파일러 개발자에게 달려 있습니다.

귀하의 질문이 “그러한 선언으로 발생할 일”인 경우-컴파일러는 첫 번째 배열 요소를 제공 한 값 (0)으로 설정하고 다른 배열 요소는 생략 된 배열 요소의 기본값이므로 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};
...
}

기술적으로 첫 번째와 같은 경우입니다.


답변