C语言野指针分析
1.?野指針的概念? ?? ?? ??? ?? ??
所謂的野指針,就是說指針指向的那塊內存,你沒有合法操作的權限,也就是指針指向非法的內存空間,這樣的指針就叫做野指針。
2.?野指針產生的原因
(1)?指針變量未初始化 ? ?? ???
任何指針變量剛被創建時不會被自動置為NULL,它的缺省值是隨機的,所以這塊內存,所以指針變量在創建時,要么初始化讓它指向一塊合法的內存,要么置為NULL。
#include <stdio.h> #include <stdlib.h>int main(void) {//int *p; //指針變量沒有被初始化,值是隨機的int a = 3;//int *p = NULL; //初始化時將指針置為空//int *p = &a; //初始化時將指針指向aprintf("%d", p); return 0; }
指針指向的內存被free或者delete釋放后,指針的值仍然為剛剛被釋放的那塊內存的首地址,但是此時指針已經失去了對那塊內存的合法訪問權限,所以在free或delete一塊內存后,要及時把指針置為NULL。
#include <stdio.h> #include <stdlib.h>int main(void) {int *p = NULL;printf("before malloc p:%d\n", p); p = (int)malloc(sizeof(int)); //malloc一塊新內存,讓p指向這塊內存printf("after malloc p:%d\n", p); //打印p的值*p = 3;printf("*p:%d\n", *p); //打印p指向的那塊內存空間的值free(p); //釋放p指向的那塊內塊空間printf("after free p:%d\n", p); // 注意:此時p中的值沒有發生變化,但是free內存后已經失去了對堆上那塊內存的合法操作性*p = 4; //非法向內存中賦值,程序可能會崩潰printf("*p:%d\n", *p);return 0; }
不要返回指向棧內存的指針或引用,因為棧內存在函數結束時會被釋放。
關鍵點: 上面的程序在運行時可能并不會產生錯誤,但并不代表這樣做是正確的,理解野指針的關鍵,就是指針指向的內存是否可以被合理合法訪問。
3.?避免產生野指針
(1) 初始化時置 NULL
(2) 指針指向的內存釋放后之后將指針置為空
本文轉自:
http://bbs.itheima.com/thread-329321-1-1.html?cazn
總結
- 上一篇: Windows下设置redis数据库允许
- 下一篇: Canvas粒子交叉线条背景动态js特效