c语言 - 当第一个指针被释放时,指向另一个指针的指针会发生什么情况?



我使用 malloc 模拟了一个堆栈,以创建一个 MAX 元素数组并将其分配给指针。然后,我做了第二个指针指向第一个指针,以便能够来回导航,执行推送和弹出。

int * stack= (int *) malloc(MAX * sizeof(*stack));
int * stack_ptr = stack;

最后,我删除包含数组的指针,使用

free (stack);

删除数组(堆栈)后,stack_ptr指向一个没有内容的地址,对吧?

这会导致内存泄漏或任何类型的问题,即使程序在之后终止?

删除数组(堆栈)后,stack_ptr指向一个没有内容的地址,对吧?

free(stack);之后,尝试执行*stack_pt未定义的行为(UB)。 指向stack_pt的内容可能是好的、坏的或丑陋的,或者只是导致代码崩溃。 试图找出答案是UB的。

这会导致内存泄漏或任何类型的问题,即使程序在之后终止?

具有以前有效指针的未更改副本本身stack_pt不是泄漏也不是 UB。 只是不要使用stack_pt.


通常在释放后,最好NULL指针。

int * stack= (int *) malloc(MAX * sizeof(*stack));
int * stack_ptr = stack;
...
free (stack);
stack = NULL;
stack_ptr = NULL;

旁白:建议分配给引用对象的大小,而不是类型,并放弃不需要的强制转换。

// int * stack= (int *) malloc(MAX * sizeof(*stack));
int *stack =  malloc(sizeof *stack * MAX);

没有内存泄漏,因为您复制了指针。因此,指针stack_ptr指向未分配空间。

如果要读取代码后stack_ptr指向的内容,则会导致分段错误,因为您释放了malloc分配的空间。

https://en.wikipedia.org/wiki/Dangling_pointer

如果您尝试取消引用它,您可能会也可能不会出现段错误,但它是悬而未决的。 不过没有内存泄漏。stack_ptr 仍在堆栈上,当函数返回时将被弹出,就像普通堆栈变量一样。 您正在释放它指向的内存。

它不是指针到指针,只有两者具有相同的值。没有什么会适合第二个。它仍将具有相同的值,但这次它将引用未分配的内存。

这是指针到指针 (PTR2):

int *ptr1;
int **ptr2 = &ptr1

相关内容