가능한 중복이 : 정의되지 않은 (그러나 선언) 변수가 사용됩니다 그래서
How an uninitialised variable gets a garbage value?정의되지 않은 값은 어떻게 생성됩니까?
, 이상한 값마다 포함되어 있습니다. 그런 가치가있는 방법은 무엇입니까? 의도적으로 임의로 생성 되었습니까?
가능한 중복이 : 정의되지 않은 (그러나 선언) 변수가 사용됩니다 그래서
How an uninitialised variable gets a garbage value?정의되지 않은 값은 어떻게 생성됩니까?
, 이상한 값마다 포함되어 있습니다. 그런 가치가있는 방법은 무엇입니까? 의도적으로 임의로 생성 되었습니까?
로컬 변수가 선언되면 컴파일러는 변수가 포함될 내부 함수의 스택 프레임 내에 슬롯을 할당합니다. 스택 프레임이 설정되기 전에 메모리에있는 특정 지점에 있던 값이 무엇이든간에 (대개 이전 함수 호출에서 해당 공간을 점유 한 스택 프레임이 누구 였는지) 그 변수의 초기 내용이됩니다.
경우에 따라 초기화되지 않은 변수는 의도적으로 일부 값으로 설정되지만 거의 무작위입니다. 예를 들어, 디버그 malloc()
은 새로 할당 된 블록의 모든 단어를 0xbadf00d로 설정하여 메모리가 할당되지 않았 음을 나타내는 마커로 사용할 수 있습니다. 따라서 구조체 멤버는 이전에 있던 것 이외의 다른 것으로 초기화 될 수 있습니다. 스택 변수에 대해 이렇게하는 컴파일러는 모르지만 존재할 수 있습니다.
임의로 생성되는 것이 아니라 잔여 메모리입니다.
매번 사용되지 않는 메모리를 모두 지우는 것은 매우 비효율적입니다. 따라서 메모리는 OS로 배포되어 사용 가능하게됩니다. 새로운 메모리를 요청할 때 누군가의 소유가 아니지만 방금 해방 되었기 때문에 쓰레기가 남아있는 메모리를 얻을 수 있지만 지워지지는 않습니다.
C가 할당하는 메모리가 정리되지 않습니다. 이 값은 메모리에 할당 된 위치의 '남은 부분'입니다.
C는 원칙적으로 프로그래머의 조작을 숨기지 않습니다. 변수를 초기화하라는 요청을하지 않았으므로 변수가 사용자를 대신하지 않으므로 대상 메모리에서 '위/아래'와 동일한 비트가 변경되지 않습니다.
c의 단위 값의 값은 메모리 주소에 저장된 값이 무엇이든간에 달라집니다. 의도적으로 무작위로 추출한 것이 아닙니다.
변수는 일부 적절한 값으로 초기화하는 오버 헤드를 피하기 위해 정의되지 않은 값을 가질 수 있으므로 무작위로 생성되지는 않습니다 (그 자체로 중요한 연산은 아닙니다). 변수의 초기 값은 그 시점에 변수의 메모리 위치에있을 것입니다.
변수를 선언 할 때마다 이미 값을 보유 할 메모리 공간이 있습니다. 명시 적으로 설정하지 않으면 이전에 그 위치에 저장된 값이 포함됩니다. 따라서 프로그램에 의해 의도적으로 무작위로 생성되는 것이 아니라 그곳에있는 가치입니다.
변수 선언은 컴파일러에게 이와 같은 변수가 하나 있고 유형이 있음을 나타냅니다. 변수의 정의는 메모리를 할당합니다. 할당 된 메모리는 stack
(auto
변수), heap
(동적 할당 메모리) 등일 수 있습니다. static
변수가 아닌 한 초기화되지 않은 데이터 세그먼트에서 메모리가 할당됩니다. 그래서 당신이보고있는 랜덤 값은 이전에 그 메모리 위치에 저장된 값일뿐입니다! 따라서 변수를 사용하기 전에 (처음으로) 변수를 초기화하는 것이 좋습니다. 즉, 초기화되지 않은 변수/포인터를 사용하거나 참조 해제하지 않는 것이 좋습니다.
메모리에있는 프로그램의 구조에 대한 자세한 내용은 here입니다.
희망 하시겠습니까?
예. 도움이됩니다. 링크를 가져 주셔서 감사합니다. – Amumu
실제로 메모리 값을 '0xbadf00d'로 설정 했습니까? 그런 육각형의 사용법을 아는 것은 좋은 일입니다. – Amumu
@Amumu : 맞습니다. Microsoft의 디버그 CRT의 동작을 설명하는 [here] (http://www.nobugs.org/developer/win32/debug_crt_heap.html#table) 페이지가 있습니다. –