指针被释放后,是不是就变成了空指针?有好多同学提出了这样的问题。
借用《C专家编程》上面的一段代码,可以很好的解释这个问题。
#includeint main() { char *s = (char *)malloc(128); strcpy(s, "helloworld"); free(s); if (s != NULL) strcpy(s, "12345"); return 0; }
这段代码大家看下有没有问题,能不能顺利运行?
前面三行都没有问题,指针 s 指向了一块堆内存,把字符串 helloworld 拷贝到堆内存中,然后释放了 s。
问题就出在这,很多同学不理解,指针 s 被释放了,是不是就变成了空指针?
如果变成了空指针,那下面的判断就不会成立,也就不会执行拷贝操作。
其实这样的理解是有问题的。
指针 s 指向了堆内存,free(s) 准确的讲,是把 s 指向的内存释放掉,这个操作对 s 本身并没有影响,s 里面保存的还是原来那块内存的地址,并不是空。
所以下面的判断语句成立,继续执行拷贝操作。
由于 s 指向的内存已经被释放掉,强行往里面拷贝,就会出现意想不到的错误。
养成良好的编程习惯就是指针被释放掉后,手动把它变成空,空指针比野指针、悬空指针更可控。
指针是C语言的精髓,如果你还是觉得模棱两可,不妨看下这套播放量近 20 万的指针教程,课程以及资料全部开源,看完后一定会让你的指针水平达到一个更高的级别。
全部0条评论
快来发表一下你的评论吧 !