C语言野指针就是未初始化的指针么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言野指针就是未初始化的指针么相关的知识,希望对你有一定的参考价值。

RT

未初始化的指针可以称为野指针(wild pointer),但是野指针并不仅仅是未初始化的指针. 一般来说,野指针(dangling pointer, wild pointer)指向的是内存中无效的对象, 这样说可能很抽象, 比如以下几个例子.

1. 如果有一段代码如下
char *dp = NULL;

  char c;
  dp = &c;
/* c falls out of scope */
当程序走出大括号作用域后, 变量c的内存(在栈中)被系统回收,但是dp仍让指向那块内存,这块内存今后很有可能被系统用作其他用途,此时如果*dp,dp指向的内容将不会是你期待的内容,此处,dp可以称为野指针.

2. 第二种情况是用户自己分配内存,然后自己释放内存,释放内存后仍然引用指针指向的内容, 比如
#include <stdlib.h>
void func()

  char *dp = malloc(A_CONST);
  free(dp); /* dp now becomes a dangling pointer */
  dp = NULL; /* dp is no longer dangling */

在执行完free(dp)后,dp是一个野指针,因为他指向的内存已经被释放掉了,系统可能会把这段内存用于其他地方.这个时候,常用的一种做法是把这个指针设为NULL, 设为NULL的指针可以由程序员使用if (dp == NULL)语句坚持出来, 但是野指针无法监测.

3. 另外一种情况是指针指向函数中分配的栈内存,函数返回后,内存被回收,但是指针指向的地址没有改变,因此这个指针也是野指针.比如
int *func(void)

int num = 1234;
/* ... */
return #


从以上三点可以总结出, 野指针其实就是就像一段无效的内存(被系统回收), 但是这个指针的值并不是NULL, 因此如果没有立刻把这个指针赋其他有效值,或者NULL值, 以后再次引用野指针就会出现segmentation faults这样的错误

参考资料:http://en.wikipedia.org/wiki/Dangling_pointer

参考技术A 野指针是指你分配内存后并且也释放了的,但是没有将指针置为NULL的指针俗称野指针。 参考技术B 野指针是指指向垃圾内存的指针,未初始化只是其中一种而已,还有就是malloc分配内存的指针未释放,越过了变量的作用范围。大概就这三种。 参考技术C 可以你new的指针,但是没有free 参考技术D free之后的呢?

以上是关于C语言野指针就是未初始化的指针么的主要内容,如果未能解决你的问题,请参考以下文章

C语言 野指针和空指针

C语言 野指针和空指针

野指针与内存操作

C语言刷题——指针概念

C语言_指针

[ C语言 ] 还不懂指针的一定要进来,带你初始指针,简单使用指针,它没有你想的那么难。