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 메모리가 쾅쾅 거리는 위협을 받으면 메모리에 다른 위치를 할당합니다. 출력이 명확하게 표시됩니다.
'realloc'은 원래 주소를 유지하는 것이 보장되지 않습니다. 더 큰 영역을 다른 곳에 할당하고 P의 내용을 비트 단위로 복사합니다. – StoryTeller
'realloc'은 새로운 내용의 포인터를 반환합니다 (이전 내용을 복사 한 곳). 힙은 할당 후에 realloc을 처리하기 위해 공간을 예약 할 수 있습니다. "비트 (bit)"는 할당되지 않으며, 단지 4 바이트 또는 8 바이트 경계에서 적절히 정렬됩니다. –
당신은'realloc'에 대해서 이야기하지만, 여러분의 코드에서'calloc'을 사용하고, 결코 첫 번째 할당을 '자유롭게'하지 마십시오. 나는 너의 추론에서 이해하기 위해 고투한다. –