결과 >


0xbfc0a178 // 자동변수 buffer1 의 주소 0xbfc0a17c // 자동변수 buffer2 의 주소 083F7008 // 1024바이트 할당된 영역의 시작주소가 대입된 buffer1 의 값 00000409 // 1024바이트 할당된 영역의 4바이트 앞에 저장된, 영역의 크기 + 영역의 크기를 저장하기 위한 공간(4) + 메모리 정렬(4) + 1(덤) 083F7410 // buffer2 의 값 00000409 // 역시 할당영역의 크기 + 메모리 정렬(4) + 1(덤 : 왜있는지 나도 모름 조사해본적 없음) 083F7008 // free 를 해도 buffer1 의 값은 변하지 않음 00021001 // 하지만 할당영역의 크기는 파괴되어 있음 083F7008 // free로 해제후 재할당해도 동일 시작 주소에 할당됨 00000011 // 1바이트를 할당해도 17바이트란 값이 적혀 있음. 083F7018 // 16바이트 증가된 위치가 할당되어 buffer2 에 대입됨 00000011 // 12바이트를 할당해도 17바이트란 값이 적혀 있음.


즉, 마지막은 <12바이트 + 영역 크기 저장용 4바이트 = 16 바이트>에 16의 배수로 떨어지니까 메모리 정렬 없이 덤 1 만 더해진거임.


이해가 가냐?

malloc 의 할당 메카니즘은, 실은 할당 요청한 크기보다 4바이트 더 큰 크기를 할당한다.

몇 바이트나 할당되었는지를 시작주소-4 인 주소에 적어 놓고 있기 때문이다.

그리고 그 크기가 16의 배수가 되게 정렬 바이트를 추가한 뒤 최종적으로 1을 더해 놓고 있다.


이해 안간다고?

너혼자 열심히 자료 찾아보던지 그냥 존나 짜봐. 난 이딴거 파악하는데 자료찾아본적 없다.

내가 어렸을때, 연속할당시 할당크기보다 더 큰 단위로 시작주소가 넘어오기에 궁금해서 그 앞 내용들을 printf로 찍어보고 이해한 것 뿐.


그리고 내가 어제

포인터 변수 a의 연산에서


a += b; 는

a = a + sizeof(*a) * b; 라고 이야기 한건,

pseudo code 다.


엄밀히 말하면,

a = typeof(a)((unsigned int)a + sizeof(*a) * b); 겠지만

a 의 타잎으로의 캐스팅 (typeof(a) 라고 적은것)을 명시할 방법이 마땅찮아서 그냥 저렇게 적은거다.