2012-06-27 2 views
2

가능한 중복은 : TC 동일 제로 동안 초기화되지 않은 변수의 값은 무엇입니까?


Is uninitialized data behavior well specified?

나는 다음 코드

#include<stdio.h> 
void main() 
{ 
int i; \ 
printf('%d',i); 
} 

결과는 VC에 쓰레기 값을 준 ++를 시도했다. 올바른 값은 무엇입니까? 초기화되지 않은 변수의 기본값은 0입니까? 또는 그것은 쓰레기 값을 포함 할 것인가?

다음에 상기 코드의 출력 될지 동일한

#include<stdio.h> 
void main() 
{ 
int i,j,num; 
j=(num>0?0:num*num); 
printf("\n%d",j); 
} 

에?

+0

정의되지 않았습니다. 그것이 쓰레기가되는 이유입니다. C에서, 당신은 자신을 초기화해야합니다. –

+2

어떤 언어입니까? C 또는 C? 오 기다려 ... –

+2

코드가 내게 준 출력 : http://i48.servimg.com/u/f48/11/68/36/17/nasal_10.png : -O – jrok

답변

8

엄밀히 초기화되지 않은 비 정적 로컬 변수의 값은 불확정[참고 문헌 1]이다.
간단히 말해서 무엇이든 될 수 있습니다. 이러한 초기화되지 않은 변수에 액세스하면 정의되지 않은 동작이됩니다. [참고 문헌 2]

[참고 문헌 1]
C99 섹션 6.7.8 초기화 : 자동 저장 기간을 가진 개체를 명시 적으로 초기화되지 않은 경우

, 값은 불확정 .

[참고 문헌 2]

C99 섹션 3.18 운데 인터넷 NED 동작 :

동작 이식성 또는 잘못된 프로그램 구조를 사용하면, 에러 데이터, 또는 중 이 값이 부적절한 객체.이 국제 표준은 아무런 요구 사항도 부과하지 않습니다.

참고 : 강조 광산.

+0

OP가 C++ 03이 아니라 C (C89?)에 대해 질문하고 있습니다. – keelerjr12

+1

@ keelerjr12 : 나중에 다시 태그 지정되었습니다. C99 용으로 수정되었습니다. –

+3

왜 그런 명백한 속임수에 대답합니까? 나는 너를 더 잘 생각했다. – sbi

1

불확정합니다. 컴파일러는 원하는 것을 할 수 있습니다.

+3

학자가되는 것; 그 값은 불확정하다; 정의되지 않은 동작이 발생합니다. –

4

C 및 C++에서 단위화된 변수에 액세스하는 것은 정의되지 않은 동작이므로 모든 값을 읽을 수 있습니다.

프로그램이 충돌 할 수도 있습니다. 정의되지 않은 행동 영역에 들어가면 모든 내기가 입니다.


1 내가 포인터가 아니라면, uninitalized 변수를 액세스하는 동안 충돌하는 프로그램을 본 적이 없다.

+1

트랩 표현을 포함하는 구현의 경우, 부호없는 char (int 포함) 이외의 모든 유형의 초기화되지 않은 객체를 읽으면 트랩이 트리거 될 수 있습니다. –

+0

표창장 필요. 이것은 대부분 잘못된 것입니다. 함정 표현이있는 시스템은 대부분 허구이며 프로그램의 대다수를 고려할 필요가 없습니다. 대부분의 경우 초기화되지 않은 변수에 액세스하면 UB가 호출되지 않습니다. https://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior – Lundin

1

값은 불확정합니다. 초기화 전에 변수를 사용하면 정의되지 않은 동작이 발생합니다.

-1

정의되지 않음입니다. 그것은 다른 컴파일러, 다른 운영 체제, 프로그램의 다른 실행 사이에 다를 수 있습니다. 특정 값이 아닐 수도 있습니다. 컴파일러는 효과가 정의되지 않았기 때문에이 코드에서 좋아하는 것을 모두 할 수 있습니다. 전체 프로그램을 최적화 할 수도 있습니다. 심지어 프로그램을 키로거를 설치하고 모든 온라인 뱅킹 로그인 세부 정보를 훔치는 프로그램으로 대체 할 수도 있습니다.

값을 알고 싶다면 유일한 방법은 설정하는 것입니다.

-1

다른 사람이 지적한대로 값은 일 수 있습니다.

가끔씩 찾기가 어려운 버그가 발생합니다. 일 때 디버그 빌드에서 하나의 값을 가져오고 릴리스 빌드에서 다른 값을 얻거나 이전 프로그램 실행에 따라 초기 값이 달라지기 때문입니다.

학습 : 항상 변수를 초기화하십시오. C#은 필드 값을 정의하고 로컬 변수를 초기화해야하는 이유가 있습니다.

관련 문제