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

What will happen in this case of malloc and realloc

malloc 为一些变量获取堆的一些连续部分,

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

malloc 再次发生在其他一些指针上

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

现在重新分配给 p

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

所以Sspace变小了???会发生吗?

我运行一个这样的程序,

#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?

P.S

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

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

唯一可以说的是,不,当然,一个指针上的 realloc() 永远不会影响另一个调用 malloc() 或任何其他分配函数返回的内存。这就是为什么realloc()returns结果指针,它可以和你传入的不一样

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

还有这个:

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

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

p = malloc(sizeof *p);

最后,虽然用 %p 打印指针是正确的,但它只对 void * 正确,并且没有自动转换,因为可变参数系统不知道;你应该转换为 void * 否则你会得到未定义的行为。

malloc 没有定义 "least allocation unit"。它是实现定义的。它还取决于 malloc 尝试使用多少内存进行簿记。

关于 realloc,realloc 将 return 相同的地址,前提是它有连续的 space 来分配新请求的大小,否则,它可能会从其他地址分配内存,并且 return 它将释放原始指针指向的内存。

可以保证的一件事是,分配一次的 space 不会在没有用户请求的情况下调整大小,即在你的问题中, "S" 的 space 永远不会自动缩小或调整大小。

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