2012-01-09 6 views

답변

2

로컬 변수가 선언되면 컴파일러는 변수가 포함될 내부 함수의 스택 프레임 내에 슬롯을 할당합니다. 스택 프레임이 설정되기 전에 메모리에있는 특정 지점에 있던 값이 무엇이든간에 (대개 이전 함수 호출에서 해당 공간을 점유 한 스택 프레임이 누구 였는지) 그 변수의 초기 내용이됩니다.

경우에 따라 초기화되지 않은 변수는 의도적으로 일부 값으로 설정되지만 거의 무작위입니다. 예를 들어, 디버그 malloc()은 새로 할당 된 블록의 모든 단어를 0xbadf00d로 설정하여 메모리가 할당되지 않았 음을 나타내는 마커로 사용할 수 있습니다. 따라서 구조체 멤버는 이전에 있던 것 이외의 다른 것으로 초기화 될 수 있습니다. 스택 변수에 대해 이렇게하는 컴파일러는 모르지만 존재할 수 있습니다.

+0

실제로 메모리 값을 '0xbadf00d'로 설정 했습니까? 그런 육각형의 사용법을 아는 것은 좋은 일입니다. – Amumu

+0

@Amumu : 맞습니다. Microsoft의 디버그 CRT의 동작을 설명하는 [here] (http://www.nobugs.org/developer/win32/debug_crt_heap.html#table) 페이지가 있습니다. –

3

임의로 생성되는 것이 아니라 잔여 메모리입니다.

매번 사용되지 않는 메모리를 모두 지우는 것은 매우 비효율적입니다. 따라서 메모리는 OS로 배포되어 사용 가능하게됩니다. 새로운 메모리를 요청할 때 누군가의 소유가 아니지만 방금 해방 되었기 때문에 쓰레기가 남아있는 메모리를 얻을 수 있지만 지워지지는 않습니다.

2

C가 할당하는 메모리가 정리되지 않습니다. 이 값은 메모리에 할당 된 위치의 '남은 부분'입니다.

C는 원칙적으로 프로그래머의 조작을 숨기지 않습니다. 변수를 초기화하라는 요청을하지 않았으므로 변수가 사용자를 대신하지 않으므로 대상 메모리에서 '위/아래'와 동일한 비트가 변경되지 않습니다.

1

c의 단위 값의 값은 메모리 주소에 저장된 값이 무엇이든간에 달라집니다. 의도적으로 무작위로 추출한 것이 아닙니다.

2

변수는 일부 적절한 값으로 초기화하는 오버 헤드를 피하기 위해 정의되지 않은 값을 가질 수 있으므로 무작위로 생성되지는 않습니다 (그 자체로 중요한 연산은 아닙니다). 변수의 초기 값은 그 시점에 변수의 메모리 위치에있을 것입니다.

1

변수를 선언 할 때마다 이미 값을 보유 할 메모리 공간이 있습니다. 명시 적으로 설정하지 않으면 이전에 그 위치에 저장된 값이 포함됩니다. 따라서 프로그램에 의해 의도적으로 무작위로 생성되는 것이 아니라 그곳에있는 가치입니다.

1

변수 선언은 컴파일러에게 이와 같은 변수가 하나 있고 유형이 있음을 나타냅니다. 변수의 정의는 메모리를 할당합니다. 할당 된 메모리는 stack (auto 변수), heap (동적 할당 메모리) 등일 수 있습니다. static 변수가 아닌 한 초기화되지 않은 데이터 세그먼트에서 메모리가 할당됩니다. 그래서 당신이보고있는 랜덤 값은 이전에 그 메모리 위치에 저장된 값일뿐입니다! 따라서 변수를 사용하기 전에 (처음으로) 변수를 초기화하는 것이 좋습니다. 즉, 초기화되지 않은 변수/포인터를 사용하거나 참조 해제하지 않는 것이 좋습니다.

메모리에있는 프로그램의 구조에 대한 자세한 내용은 here입니다.

희망 하시겠습니까?

+0

예. 도움이됩니다. 링크를 가져 주셔서 감사합니다. – Amumu

관련 문제