2009-06-17 3 views
4

C 프로그램이 시작되고 변수가 메모리 위치에 할당되면 C 표준은 그 값이 초기화되는지 말합니까? 위의 코드에서 변수의 기본 상태는 무엇입니까?

// global variables 
int a; 
int b = 0; 
static int c; 

, 'B'는 'A'의 초기 값은 무엇 0으로 초기화 될 것인가? 'c'는이 모듈에 정적이기 때문에 다른 것입니까?

답변

11

특별히 글로벌 변수를 언급 이후 : 글로벌 변수의 경우, 그들은 static를 선언 여부와는, 그들은 될 것입니다 반면에 0

지역 변수로 초기화됩니다 정의되지 않은 (선언 된 경우가 아니면 static,이 경우도 0으로 초기화됩니다 - 감사합니다. Tyler McHenry). Translated는 어떤 특별한 것을 담고있는 것에 의존 할 수 없다는 것을 의미합니다. 즉, 임의의 쓰레기가 이미 그 위치에있는 메모리에 포함되어있을뿐입니다. 실행에 따라 다를 수 있습니다.

+2

정적 로컬 변수도 0으로 초기화됩니다. –

5

편집 :는 다음 로컬 변수에 적용 -하지 전역.

변수의 초기 값은 정의되지 않습니다. 어떤 언어에서는 메모리에있는 변수의 위치는 선언시에 0이되지만 C (및 C++에서도)는 초기화되지 않은 변수에 그 위치에있는 모든 가비지가 포함됩니다.

그래서 가장 좋은 방법은 초기화되지 않은 변수가 가비지를 포함하고 정의되지 않은 동작을하는 것입니다.

+1

이는 자동 지속 기간의 로컬 변수에만 해당됩니다. –

+0

-1, 전역 변수의 컨텍스트에서 잘못되었습니다. 게시물이 변경되면 핑 (Ping) 한 다음 다운 보트를 제거합니다. –

+0

Yikes! "// 전역 변수"주석을 보지 못했습니다. 나는 그것을 반영하여 편집 할 것입니다. –

0

빠른 테스트는를 나타내고, C는 0

int a; 
static int c; 
int main() { 
    printf("%d %d\n", a, c); 
    return 0; 
} 

의 위치가되도록 (그리고 c) 컴파일 시간에 결정된다; 즉, 스택이나 malloc에 ​​의해 반환 된 메모리 간격에 배치되지 않습니다. C 표준은 모든 경우에 0으로 초기화되었다고 말합니다.

저는 c에 대해 99.9 %의 확신을 가지고 있으며 a에 대해서는 98 % 확신합니다. static 키워드는 전역 변수의 문맥에서 실제로는 (말) C++과 Java에서 private과 유사합니다. 저장 위치가 아니라 가시성에 관한 것입니다.

초기화되지 않은 변수에 대한 Andrew Hare의 설명은 스택 또는 malloc 된 메모리에 저장된 데이터에 해당됩니다. 정적으로 저장된 변수에는 그렇지 않습니다.

+1

C 언어 표준이 이러한 동작을 보장하지만, "테스트"는 실제로 이것을 테스트하지 않습니다. C가 전역 변수를 0으로 설정하지 않았다면 상상해보십시오.하지만 실행했을 때 디버그 모드에서 a와 c가 이미 저장되어있는 메모리의 값은 –

+1

입니다. 최신 디버거는 메모리를 특정 비트 패턴으로 채 웁니다. 따라서 변수를 초기화하지 않은 경우 즉시이를 알 수 있습니다. 예를 들어, Visual Studio는 이런 방식으로 작업을 수행합니다. – codymanix

+0

@ codymanix : 좋은 지적. (Minor nit : 적어도 MSVC++의 경우 디버그 컴파일 된 .EXE가 비트 패턴 자체로 메모리를 초기화합니다. 즉, 외부 디버거가 실행 중인지 여부와 관계 없음) –

4

a도 전역이고 명시 적으로 초기화되지 않은 경우 c도됩니다. 로컬 정적 변수에도 해당됩니다.

로컬 비 정적 변수 만 초기화되지 않습니다. 또한 malloc으로 할당 된 메모리는 초기화되지 않습니다.

다른 개체에 대한 C의 초기화 및 할당 규칙은 here을 참조하십시오.

+0

+1 다른 항목에 대한 +1 링크 – Tom

1

오늘 아침에 너무 천천히 입력하고 있습니다. 응답 할 때 세 명이 빨리 갑자기 나타 났으므로 대부분의 게시물을 삭제했습니다.내가 발견 한 링크는 명확하고 간결 했으므로 아무렇게나 게시하고 있습니다. Wikipedia on "uninitialized variable" 기본 문제에 대한 토론.

관련 문제