【问题标题】:What will happen in this case of malloc and realloc在这种 malloc 和 realloc 的情况下会发生什么
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    没有定义 malloc 的“最小分配单元”。它是实现定义的。它还取决于 malloc 尝试使用多少内存来记账。

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

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

    【讨论】:

    • 我在提出问题时犯了一些错误,对其进行了编辑。显然,您的回答行为已显示,如果我已正确检查自己,则不应该问这个问题。
    【解决方案3】:

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

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

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

    还有,这个:

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

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

    p = malloc(sizeof *p);
    

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

    【讨论】:

    • 更改为 sizeof(*p)。
    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多