在这种情况下 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 的内存位置将被更改。所以你展示的东西永远不会发生。
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 的内存位置将被更改。所以你展示的东西永远不会发生。