C语言野指针

1)野指针

野指针就是指向的内存地址是未知的随机的,不正确的,没有明确限制的。指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知的,操作系统不允许操作此指针指向的内存区域。野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。

2)野指针产生原因

1. 指针未初始化

指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它所指的空间是随机的。

int main()

{

int * p;

*p = 20;

return 0;

}

2. 指针越界访问

指针指向的范围超出了合理范围,或者调用函数时返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。

int main()

{

int arr[10] = {0};

int *p = arr;

for(int i = 0; i <= 11; i++)

{

*(p++) = i;

}

return 0;

}

3 .指针释放后未置空

有时指针在free或delete后未赋值NULL,便会使人以为是合法的。其实它们只是把指针所指的内存给释放掉,但并没有把指针本身忘记。此时指针指向的就是无效内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。

int main()

{

int *p = NULL;

p = malloc(10 * sizeof(int));

if (!p)

{

return;

}

free(p);

p = NULL;

return 0;

}

​4.空指针

为了标志指针变量没有指向任何变量(空闲可用),在C语言中,通常把NULL赋值给此指针,这样就标志此指针为空指针,没有指向任何空间。对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针解引用是一个非法的操作,所以在解引用之前,必须确保它不是一个NULL指针。

void test()

{

char *p = NULL;

strcpy(p, "1111"); 

char *q = 0x1122;

strcpy(q, "2222"); 

}

你可能感兴趣的:(C语言,c++,开发语言,c语言)