5个回答
展开全部
未初始化的指针可以称为野指针(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这样的错误
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
展开全部
野指针是指你分配内存后并且也释放了的,但是没有将指针置为NULL的指针俗称野指针。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
野指针是指指向垃圾内存的指针,未初始化只是其中一种而已,还有就是malloc分配内存的指针未释放,越过了变量的作用范围。大概就这三种。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以你new的指针,但是没有free
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
free之后的呢?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询