답변:
마법이 아닙니다.
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};
...
}
기술적으로 첫 번째와 같은 경우입니다.