programing

초기화되지 않은 정수는 항상 c에서 0으로 기본 설정됩니까?

skycolor 2023. 10. 4. 21:07
반응형

초기화되지 않은 정수는 항상 c에서 0으로 기본 설정됩니까?

nginx의 소스 코드를 읽고 있는데 많은 숫자 변수를 초기화하지 않고 있습니다.ngx_int_t ngx_last_process;,여기서ngx_int_t로 정의된long int

#if 0
    ngx_last_process = 0;
#endif

그러면 여기 @Igor Sysoev는 초기화를 할 필요가 없다고 생각합니까?

하지만 프로그램에서 기본값은0:

    for (s = 0; s < ngx_last_process; s++) {
        if (ngx_processes[s].pid == -1) {
            break;
        }
    }

초기화되지 않은 변수가 다음 값을 갖는 것이 보장됩니까?0cat의 가치는?

외부 변수와 정적 변수는 기본적으로 0으로 초기화되며, 이는 보장됩니다.명시적 이니셜라이저가 없는 자동레지스터 변수는 불특정 값(지정되지 않은 값 또는 트랩 표현)을 갖습니다.

기준:

C89

6.5.7:

정적 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우 산술 형식을 가진 모든 멤버에 0이 할당되고 포인터 형식을 가진 모든 멤버에 null 포인터 상수가 할당된 것처럼 암묵적으로 초기화됩니다.자동 저장 기간을 가진 개체가 명시적으로 초기화되지 않은 경우 해당 값은 결정되지 않습니다.

C99

6.2.4, §5:

가변 길이 배열 유형이 없는 개체의 경우 연결된 블록에 대한 입력부터 해당 블록의 실행이 종료될 때까지 수명이 연장됩니다.(밀폐된 블록에 들어가거나 함수를 호출하면 현재 블록의 실행이 중지되지만 종료되지는 않습니다.)블록을 재귀적으로 입력하면 개체의 인스턴스가 매번 새로 만들어집니다.개체의 초기 값이 결정되지 않았습니다.개체에 대해 초기화가 지정된 경우 블록 실행 시 선언에 도달할 때마다 수행되며, 그렇지 않은 경우 선언에 도달할 때마다 값이 결정되지 않습니다.

6.7.8, §10:

자동 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우 해당 값은 결정되지 않습니다.정적 저장 기간이 있는 개체가 명시적으로 초기화되지 않은 경우:

— 포인터 유형을 가진 경우 Null 포인터로 초기화됩니다.

— 산술 형식을 가질 경우 0(양수 또는 부호 없음)으로 초기화됩니다.

— 집합체인 경우, 모든 구성원은 이 규칙에 따라 (recurs적으로) 초기화됩니다.

— 조합일 경우, 첫 번째 명명된 구성원은 이 규칙에 따라 초기화( recurs적으로)됩니다.

3.17.2, §1:

불확정 값: 지정되지 않은 값 또는 트랩 표현

3.17.3, §1:

unspecified value: 이 국제 표준이 어떤 경우에도 어떤 값이 선택되는지에 대한 요구 사항을 부과하지 않는 관련 유형의 유효한 값.참고 지정되지 않은 값은 트랩 표현이 될 수 없습니다.

automatic(local) 변수는 0을 보장하지 않으며 가비지를 포함할 수 있습니다.

globalsstatic변수는 0으로 보장됩니다.

(로))int파일 범위에서 0으로 초기화됩니다.

int i;
int main()
{
   int x;
   printf("%d",i); // prints 0
   printf("%d",x); // prints some unspecified value
}

초기화되지 않은 변수가 c에서 0의 값을 갖는 것이 확실합니까?

아니요! 함수 범위에서 선언된 변수에는 해당되지 않습니다.

변수가 어떻게 할당되느냐에 따라 달라집니다.는 된 변수는 0됩니다합니다.malloc()아닙니다.

언급URL : https://stackoverflow.com/questions/6212921/is-un-initialized-integer-always-default-to-0-in-c

반응형