欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

悬挂指针问题实例

程序员文章站 2022-05-11 22:33:36
...

今天在写代码的时候遇到一个问题,当然本身我也是写一个小的例子测试内存的分配和释放的问题,一下子碰到了这个悬挂指针的问题:

错误代码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
 {
    int *p;
     {
         int a = 10;

         p = &a;
         printf("%p", &a);

     }

     int *b = (int *)malloc(sizeof(int));
     b = p;
     free(b);
     b = NULL;

     return 0;
 }
                 

这段代码用gcc编译没有任何错误,你可能也觉的没有问题了,其实这段代码中存在两个指针的问题有待解决,我们来看看这段代码的内存使用情况如下:

悬挂指针问题实例

没错,在栈上有四字节的内存内有释放,这究竟是为什么呢?你看出来了吗?

再来看改正后的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void)
 {
    int *p;
     {
         int a = 10;

         p = &a;
         printf("%p", &a);

     }

     int *b = (int *)malloc(sizeof(int));
     int *m = b;
     b = p;
     free(m);
     m = NULL;

     return 0;
 }

看看内存使用情况:

悬挂指针问题实例

内存全部释放,对比两个代码,问题应该很明显了,没错,在将b指向了heap上的那块内存以后,我把b的地址指向了p,这时候

申请的堆内存的地址就没有了,我们程序员无法获取,就造成了悬挂指针的问题,所以在第二个程序中我用m保存这段内存的地址,最后释放。别忘了把m置null。

上面的代码都有一个共同的问题,就是指针p,指针p指向main中一个子域的局部变量a,当出域的时候a自动释放,p有可能成为一个野指针,野指针对程序的健壮性有较大影响,你并不知道在你的后续编程中会不会与这个指针指向的地址发生冲突。

野指针通常编译器无法检查出来,所以编程时要十分小心。

相关标签: free malloc