【发布时间】:2017-08-19 21:31:06
【问题描述】:
malloc 为某个变量占用堆的一些连续部分,
-------------
| p |
-------------
malloc 再次发生在其他指针上
------------- -----------------
| 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' 指向的内存大小,是否有可能将我带到 s 的指向内存,然后我可以使用 p 访问 s?
附言
编辑问题以正确说出我想说的话。 一旦 s 的内存受到踩踏的威胁,realloc 将在内存中分配其他位置。它在输出中清晰可见。
【问题讨论】:
-
realloc不保证保留原始地址。它将在别处分配一个更大的区域并按位复制 P 的内容。 -
realloc将返回一个指向新内存块的指针(它已复制到旧内容)。堆可以在分配后保留空间以应对重新分配。没有分配“位”,只有字节,并且可能适当地排列在 4 或 8 字节边界上。 -
您谈论的是
realloc,但在您的代码中您使用calloc,而不是free您的第一次分配。我很难从你的推理中理解。 -
我发错了问题。
-
编辑了问题和细节。
标签: c malloc dynamic-allocation calloc