2017-03-27 1 views
2

malloc에 ​​다시 malloc에이의 malloc과 realloc을이 경우에 무슨 일이 일어날 지

------------- ----------------- 
|  P  |  S   | 
------------- ----------------- 

지금 realloc을 페이지에 대해 어떻게 다른 포인터가 발생, 일부 변수

------------- 
|  p  | 
------------- 

을 힙의 일부 연속 참가

------------------- ----------- 
|  p   | S  | 
------------------- ----------- 

그래서 S 공간이 줄어 듭니 까? 그런 일이 있습니까? 나는이 같은 프로그램을 실행

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
int *p; 
char *s; 
p = malloc(sizeof(*p)); 
printf("1:p points to %p\n", (void *)p); 
//printf("1:p points to %p\n", (void *)(p+1)); 
s = malloc(sizeof(*s)); 
printf("1:s points to %p\n", (void *)s); 
p = realloc(p, sizeof(*p)*2); 
printf("2:p+2 points to %p\n", (void *)(p+2)); 
p = realloc(p, sizeof(*p)*7); 
printf("3:p points to %p\n", (void *)(p)); 
printf("3:p+7 points to %p\n", (void *)(p+7));//should run over s's memory 
printf("2:s points to %p\n", (void *)s); 
free(p); 
p = NULL; 
free(s); 
s = NULL; 
return 0; 
} 
output: 
1:p points to 0x1291010 
1:s points to 0x1291030 
2:p+2 points to 0x1291018 
3:p points to 0x1291050 --> location of p pointed to by p is changed. 
3:p+7 points to 0x129106c 
2:s points to 0x1291030 

그래서 일단의 malloc은 그 자체가 0x20 = 32 바이트를했다? 0x1291030 - 0x1291010 = 0x20 = 32 바이트.

'p'가 가리키는 메모리의 크기가 계속 증가하면 나를 뾰족한 메모리로 유도하고 p를 사용하여 s에 액세스 할 수 있습니까?

p.s

정확하게 내가 말하고 싶은 말을 편집했습니다. realloc은 s 메모리가 쾅쾅 거리는 위협을 받으면 메모리에 다른 위치를 할당합니다. 출력이 명확하게 표시됩니다.

+0

'realloc'은 원래 주소를 유지하는 것이 보장되지 않습니다. 더 큰 영역을 다른 곳에 할당하고 P의 내용을 비트 단위로 복사합니다. – StoryTeller

+0

'realloc'은 새로운 내용의 포인터를 반환합니다 (이전 내용을 복사 한 곳). 힙은 할당 후에 realloc을 처리하기 위해 공간을 예약 할 수 있습니다. "비트 (bit)"는 할당되지 않으며, 단지 4 바이트 또는 8 바이트 경계에서 적절히 정렬됩니다. –

+0

당신은'realloc'에 대해서 이야기하지만, 여러분의 코드에서'calloc'을 사용하고, 결코 첫 번째 할당을 '자유롭게'하지 마십시오. 나는 너의 추론에서 이해하기 위해 고투한다. –

답변

2

malloc에 ​​정의 된 "최소 할당 단위"가 없습니다. 구현 정의입니다. 또한 malloc이 책 관리 목적으로 사용하려고 시도하는 메모리 양에 따라 다릅니다.

realloc과 관련하여 realloc은 새로 요청한 크기에 할당 할 인접한 공간이있는 경우 동일한 주소를 반환합니다. 그렇지 않으면 다른 주소에서 할당 한 메모리를 반환하고 원래 포인터가 가리키는 메모리를 확보합니다.

한 번 할당 된 공간은 사용자가 요청하지 않으면 크기가 조정되지 않습니다. 즉, 질문에서 "S"의 공간이 자동으로 축소되거나 크기가 조정되지 않습니다.

+0

질문을하면서 실수를했습니다. 편집했습니다. 외관상으로는 당신의 응답 행동은 보여지고 나가 제대로 검사 했었던 경우에이 질문은 결코 묻지 않아야했다. – acidlategamer

3

이 모든 것은 구현에 따라 정의되므로 일반적으로 추론 할 수 없습니다.

말할 수있는 유일한 점은 realloc()은 물론 malloc() 또는 다른 할당 기능에 대한 다른 호출에 의해 반환 된 메모리에 영향을주지 않습니다. realloc()이 포인터를 결과로, 그것은 당신이 전달 된 하나와 다를 수 있습니다 반환 이유 malloc()과 친구의

내부 동작이 할당에 따라 달라집니다., 많은 할당 자들이있다. 표준 라이브러리의 선택에 동의하지 않으면 다른 라이브러리를 사용하여 작업 할 수 있습니다. 또한

이 :

int *p; 
p = malloc(sizeof(p)); 

는 거의 의미가, 당신은 포인터 지점에서 데이터의 크기와 동일하지 않은 포인터의 크기를 할당하고 (예 : 정수) . 그렇게하려면, 당신은 사용해야합니다

p = malloc(sizeof *p); 

을 마지막으로, 올바른 %p로 포인터를 인쇄하는 동안, 그 void * 만 맞습니다과 가변 인자 시스템이 알고하지 않기 때문에 더 자동 변환은 없습니다; void *으로 캐스트해야하며 그렇지 않으면 정의되지 않은 동작이 발생합니다.

+0

이 sizeof (* p)로 변경되었습니다. – acidlategamer

1

재 할당 할 공간이 충분하지 않으면 p의 메모리 위치가 변경됩니다. 그래서 당신이 보여주는 것은 결코 일어나지 않습니다.

관련 문제