在这种情况下malloc和realloc会发生什么

时间:2017-03-27 08:54:48

标签: c malloc dynamic-allocation calloc

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字节。

如果我不断增加内存大小,可能会出现这样的情况:&#39; p&#39;会引导我指向内存,然后我可以使用p?

访问s

P.S

编辑问题以正确说出我想说的话。 一旦s的内存受到威胁,realloc将在内存中分配一些其他位置。它在输出中清晰可见。

3 个答案:

答案 0 :(得分:3)

所有这些都是实现定义的,因此一般无法推理。

唯一可以说的是,当然,一个指针上的realloc()不会影响另一个malloc()调用或任何其他分配函数返回的内存。这就是realloc() 返回结果指针的原因,它可能与您传入的指针不同。

malloc()和朋友的内部运作取决于分配器,并且有许多分配器。如果您不同意其选择,可以通过使用其他实现来解决标准库的问题。

另外,这个:

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

没有意义,你正在分配指针的大小,这与指针指向的数据大小(即整数)不同。为此,您应该使用:

p = malloc(sizeof *p);

最后,虽然使用%p打印指针是正确的,但这只适用于void *并且由于varargs系统不知道而没有自动转换;你应该转向void *或者你得到未定义的行为。

答案 1 :(得分:2)

malloc没有定义的“最小分配单位”。它是实现定义的。它还取决于malloc尝试将多少内存用于簿记目的。

关于realloc,如果realloc具有为新请求的大小分配的连续空间,则realloc将返回相同的地址,否则,它可能会从其他地址分配内存并返回它并释放原始指针所指向的内存。 / p>

有一件事是保证分配的空间不会在没有用户请求的情况下调整大小,即在您的问题中,“S”的空间永远不会自动缩小或调整大小。

答案 2 :(得分:1)

如果没有足够的空间重新分配,p的内存位置将会改变。所以你展示的东西永远不会发生。