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

时间:2019-03-11 22:02:32

标签: c pointers malloc pointer-to-pointer

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

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

最后,我使用

删除包含数组的指针
free (stack);

删除数组( stack )后, stack_ptr 指向没有内容的地址,对吗?

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

4 个答案:

答案 0 :(得分:2)

  

删除数组(堆栈)后,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);

答案 1 :(得分:1)

没有内存泄漏,因为您做了指针的副本。因此指针stack_ptr指向未分配空间。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

它不是指向仅具有相同值的指针。第二件事什么都不会发生。它将仍然具有相同的值,但是这次它将引用未分配的内存。

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

int *ptr1;
int **ptr2 = &ptr1