2017-05-10 6 views
-4

나는 특정 알고리즘을 따르고 실제로는 쓰레기가 아닌지 묻는다.C에서 생성 된 변수의 가비지 값은 어떻게됩니까?

즉, "쓰레기"값이 얼마나 정확하게 표시됩니까? UB를 호출하지 않는 것을 고려하면 가비지 값을 읽으면 그 값의 소스는 무엇입니까?

+1

쓰레기는 쓰레기입니다. 알고리즘이 있다면 가비지가 아니기 때문에 "알려진 정의 가능하고 아마도 재현 가능한 패턴으로 바보 같은 값이 생성됩니다." – John3136

+2

미리 알고 있었기 때문에 오버 헤드가 발생하지 않아 지정된 값으로 설정됩니다. 알고리즘이 없습니다. –

+0

정의되지 않은 행동에 관한 질문을 복제본으로 표시하기 위해이 사이트에서 사용할 수있는 결정적 요소가 있습니까? – paddy

답변

6

표준에는 "가비지"라는 용어는 언급되지 않았지만 "비결정/불확정 값"을 언급합니다. 값은 일 수 있습니다.입니다. 참고

사용자 관점에서 볼 때 특정 값 (모든 변수)에 대한 수정 값을 얻을 수 없다면 "기대 값"이 언제든지 일치하지 않으며 우리가 얻는 값 (있는 경우)은 다음과 같습니다. 어떤 용도로도 사용되지 않으므로 "쓰레기"로 간주됩니다.

가장 일반적이며 일반적인 관찰/구현은 초기화되지 않은 자동 변수의 경우 저장소 만 할당되며 해당 저장소의 내용은 적용되지 않습니다. 그래서, 아마도 그것은이라는 마지막 저장된 값 을 여전히 포함하고있을 것입니다. 이제, 그 값은 아마도 다른 (이전) 시나리오에서 유효한 것으로, 현재의 경우에는 의미가 없기 때문에 현재 시나리오에서는 "쓰레기"입니다.

TL; DR는 "가비지"값은 대부분의 경우에, 그 해당 메모리 위치의 단지 마지막 저장된 값이다, 생성하지 된다.


참고 : 그 값은 불확정

관련, C11에서 인용 자동 저장 기간을 가진 개체를 명시 적으로 초기화하지 않는 경우 장 §6.7.9

입니다. [...]


§§ 추가 읽어

이것은 매우 밀접하므로 각주로 추가 주제에 관한 것이다.

이 경우, 변수의 어드레스하려는 다음

촬영되지 않은 데이터 유형이 트랩 표현을

  • 가질 수 비결정론 값

    • 보유 변수를 존재 값을 읽으려면 실제로 undefined behavior이됩니다. 알고 있어야합니다.

  • 0

    초기화되지 않은 경우 스택의 변수 (자동 변수라고도 함)에 가비지 값이 존재합니다. 스택에있는 주소, 이전 함수 호출 등에있는 이전 변수로 푸시, 팝, 초기화됩니다.

    3

    C가 스택과 힙에 메모리를 할당 할 때 메모리 주소에 저장된 것을 수정하지 않고 단순히 변수의 공간을 지정합니다. 초기화되지 않은 변수는 변수를 선언하기 전에 해당 위치의 메모리에 있던 값을 포함합니다. 때로는 값이 사용되어 지워지는 프로그램의 이전 메모리가 될 것이며, OS, 스택 카나리 등의 값이 될 것입니다. 거기에 있을지 예측할 방법이 없습니다.

    +2

    또한 일부 C 변수는 프로세서 레지스터에만 저장되며 "가비지 값"은 이전에 저장된 레지스터의 데이터입니다. –

    0

    모든 특정 메모리 주소 (스택 또는 힙)에는 일부 데이터가있을 것입니다. 해당 메모리를 변수에 할당하기 전에 다른 변수 (OS 또는 다른 프로그램이 될 수 있음)에서 사용할 수 있습니다. 따라서 마지막으로 할당 된 변수에 의해 할당 된 마지막 값을 포함 할 수 있습니다. 그리고 그 가치들은 이제 우리에게 쓸모가 없습니다. 그게 우리를 위해 쓰레기가 된 이유