当第一个指针被释放时,指向另一个指针的指针会发生什么?

What happens to a pointer to another pointer when the first one is freed?

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

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

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

free (stack);

我删除数组(stack)后,stack_ptr是指向一个没有内容的地址吧?

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

没有内存泄漏,因为您复制了指针。所以指针 stack_ptr 指向未分配 space.

如果你想在你的代码之后读取stack_ptr指向的内容,它会导致段错误,因为你释放了你的malloc分配的space。

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

如果您尝试取消引用它,您可能会或可能不会出现段错误,但它是悬空的。虽然没有内存泄漏。 stack_ptr 仍然在堆栈上,并且会在函数 returns 时被弹出,就像普通的堆栈变量一样。您正在释放它指向的内存。

它不是指向指针的指针,只是两者具有相同的值。第二个不会发生任何事情。它仍将具有相同的值,但这次它将引用未分配的内存。

这是指向指针 (ptr2) 的指针:

int *ptr1;
int **ptr2 = &ptr1

After I delete the array (stack), stack_ptr is pointing to an address with no contents, right?

free(stack); 之后,尝试执行 *stack_pt未定义的行为 (UB)。指向 stack_pt 的内容可能是好的,也可能是坏的或难看的,或者只是导致代码崩溃。想知道是UB

Can this cause a memory leak or any kind of problem, even if the program terminates exactly after?

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);