【问题标题】:C Memory allocation, overwriting after freeingC内存分配,释放后覆盖
【发布时间】:2019-03-06 01:52:42
【问题描述】:

我被一个关于内存分配的问题困住了,特别是在 free() 语句之后会发生什么。因此,例如,当我释放 a 然后更改其地址时,a 是否仍具有其旧值,还是会获得 b 的地址?是否因为我在释放它后调整它而成为悬空指针?输出是否只是具有相同值的 a 和 b,z-20 和 w=9? 我会很感激任何帮助。非常感谢!

int* t = (int*) malloc(sizeof(int)); 
int* b = (int*)    malloc(sizeof(int)); 
int* a = (int*) malloc(sizeof(int)); 
int w;
int z;

*a = 11;
*b = 9;
z = *a + *b; 
w = *b;
*a = z; 
free(a);

*t = 4;
b = &z;
a = b; 
free(t);

printf("Printed results are:\n");
printf("*a=%d, *b=%d, z=%d, w=%d\n", *a, *b, z, w);

【问题讨论】:

  • 你不能改变变量的地址。
  • 你不能转换malloc()的结果!
  • b = &z; 最初分配给 b 的内存不再可访问和泄漏。
  • 为什么不能自己编译找到结果?
  • 作为@Swordfish 评论的后续,请参阅:Do I cast the result of malloc? 请注意,'*' 通常附加到变量而不是类型。 int* a, b, c; 肯定不会声明三个指向 int 的指针。而是int *a, b, c; 使这一点更加明显。

标签: c pointers memory free


【解决方案1】:

当我释放 a 然后更改它的地址时,a 是否仍然具有它的旧值或者它会获得 b 的地址

会得到b中的指针值,即z的地址。

代码应该在将 b 重新分配给 z 的地址之前释放它:

free(b);
b = &z;

否则我看不出代码有问题,因为它似乎没有取消引用任何已释放的指针。

输出

这是你所期望的:

*a=20, *b=20, z=20, w=9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多