2017-04-20 5 views
0

그래서 오늘 malloc (1024)을 호출하여 힙을 가지고 놀았습니다. 나는 대부분 힙의 구조를 이해하고 있기 때문에, 무엇이 메모리에 있었는지를 출력 할 때 "00000000 00000409 00000000 00000000 ...."이 표시되는 것에 놀라지 않았다.내 힙은 무엇입니까? C linux

그러나 1032 바이트가 지나면 나는 예상했다. 힙의 가장 큰 덩어리를 찾는다. 대신 malloc (1024) 호출이 처음 시도 된 후 다른 호출이 발생한 것처럼 다른 청크를 발견했습니다. 로 변환

00000000 00000409 30387830 65336234 
30203a30 30303030 20303030 30303030 
30303030 30303020 30303030 30302030 
34303030 33203930 33303330 20303330 
30333033 30333032 33343320 33303330 
33332030 39333032 000a3233 00000000 

이 :이 존재하는 이유

08x0e3b40 :00000 00000000000000 000000 040003 903030 03003030302343 303033#09302 
23 

사람이 알고 있나요이 덩어리에서

은 다음과 같다? 한 번 malloc 만 호출 할 것이라고 확신합니다. 그리고 그것은 언제나 malloc 크기에 상관없이 거기에있는 것처럼 보입니다.

+2

컴퓨터에서 다른 일이 일어나니까? 또한 당신은 거기에 있기를 기대 했습니까? (예 : * "힙의 맨 덩어리"* 란 무엇입니까?) – UnholySheep

+1

혹시 제비의 문자열이 포함 된 문자열로 print를 호출하지 않았습니까? ASCII 30303030? – stark

+1

'brk'에서의 이동량 (데이터 세그먼트 크기의 변화)은 할당 자에 따라 다릅니다. 'malloc' 호출에서 실제로 요청한 것 이상으로 옮길 수 있습니다. 따라서 데이터가 반드시 힙의 맨 위에있는 것은 아닙니다. – Arash

답변

4

malloc은 힙에 특정 양의 메모리를 예약하고이 메모리 블록 (또는 원하는 메모리 블록을 할당 할 수없는 경우 NULL)에 대한 포인터를 제공합니다. 그러나 malloc은 어떤 식 으로든 메모리 블록을 초기화하지 않습니다. 0 또는 다른 값으로 채우지 않습니다. 단순히 콘텐츠를 그대로 유지합니다.

그래서 질문은 실제로 "프로그램이 시작될 때 힙의 초기 내용은 무엇입니까?" 그리고 대답은 운영 체제에 달려 있습니다. 실행시 프로그램에 할당되는 메모리 부분과이 메모리 블록의 내용이 무작위가 아닌 "정의되지 않은 것"일 가능성이 큽니다. 이것은 몇 가지 되풀이되는 패턴 일 수 있으며 0 일 수도 있고 모든 것이 될 수도 있습니다.

프로그램의 힙 부분을 살펴보면 malloc을 사용했는지 여부와 관계없이이 "무언가 미정의"내용이 표시됩니다. 귀하의 경우처럼 반복되는 패턴을 볼 수 있습니다. 그러나 할당되지 않은 힙의 "찾는 부분"은 실제로 정의되지 않은 동작입니다.