C内存分配,释放后覆盖

C Memory allocation, overwriting after freeing

我被一个关于内存分配的问题困住了,特别是在 free() 语句之后发生了什么。因此,例如,当我释放 a 然后更改其地址时,a 是否仍具有其旧值,还是会获取 b 的地址? a 会不会因为我释放后调整它而变成悬空指针?输出是否只是具有相同值的 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);

when I free a and then change its address, will a still have its old value or will it get the address of the b

会得到b中的指针值,也就是z的地址

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

free(b);
b = &z;

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

output

这是你所期望的:

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