structstudent
stu,
*pstu;
intmain(
void
)
這是很多人都容易犯的錯誤:定義了結構體變數stu,但結構體內部的char * name在定義結構體時只是為其分配了4位元組的記憶體,沒有指向乙個合法的位址,這時其指標指向的區域只是一些亂碼,有事還沒有訪問許可權。這就是我們通常所說的野指標,它是許多程式bug的根源。
為了避免出現野指標,通常我們需要將指標初始化為null,用完後也為其賦值為null。
結構體成員指標往往會被我們忽視,注意它也需要初始化,且需要為結構體指標分配足夠的記憶體,真是就用到了malloc這個巨集,使用方法如下:
給指標變數賦初值:
方法一:char * p = (char * )malloc(sizeof(char));
方法二:char * p = null;
給陣列賦初值:
方法一: int a[10] = ;
方法二: memset(a, 0, sizeof(a));
memset函式有3個引數:第乙個是要被設定的記憶體起始位址;第二個是要被設定的值;第三個是要被設定的記憶體大小,單位為位元組;
給結構體指標賦初值:
方法一: pstu = (struct student *)malloc(sizeof(struct student));
常見錯誤: pstu = (struct student *)malloc(sizeof(struct student *));
為了避免出現野指標,在程式的debug版本裡可以如下處理:
在函式的入口處使用assert(null != p)對引數進行校驗。或者用if(null != p)來校驗。它會提醒我們有沒有初始化指標,起到定位錯誤的功能。
assert是個巨集,它後面括號裡的條件若不滿足,則程式終止執行並提示出錯。
使用完指標後務必記得釋放指標所指向的記憶體,否則不知道什麼時候我們又改變了指標的值,使其變成了野指標!
這裡就需要free(p)這個函式的幫忙了,它可以切斷指標與指向記憶體的聯絡。但是需要注意的是free對於同一指標變數只能使用一次。不然會導致出錯或者記憶體洩漏。
釋放完記憶體後另指標的值變為null!
如下:free(p);
p = null;
同理:
void main22()
if (p != null)//
指標變數還是指向原來的記憶體空間,但是記憶體空間已經被釋放
system("pause");
產生野指標原因的本質
:指標變數和它所指記憶體空間變數是兩個不同的概念。
解決方法:
1、定義指標時,把指標變數賦值成
null
2、釋放記憶體是,先判斷指標變數是否為
null
3、釋放完記憶體後,把指標變數重新複製成
null
野指標的產生及其避免
野指標的產生及其避免 null 避免,而只能通過養成良好的程式設計習慣來盡力減少。對野指標進行操作很容易造成程式錯誤。總的來說,野指標是一種記憶體錯誤。其產生的原因主要有一下幾點 1 訪問了不該訪問的記憶體 如果我們的指標變數沒有被我們初始化,系統會為我們的編譯器隨機為我們的指標指定記憶體。既然是系...
C語言野指標的產生原因及避免辦法
見如下程式例項 include include int main printf p1 d,p1 d n p1,p1 if p1 null 目的 釋放p1 printf p1 d,p1 d n p1,p1 system pause return 0 程式執行結果為 p1 0,p1 2031188 p1...
避免野指標的方法
野指標是沒有初始化的指標,它非法的指向一塊記憶體空間,會造成記憶體洩露,產生段錯誤。避免野指標有以下幾點 1 養成良好的變成習慣,當不能確定指標指向時,初始化為空 2 當給初始化指標賦值時,要用malloc給其分配記憶體空間。3 檢查空間是否分配成功 4 清理記憶體空間 5 使用完記憶體空間後釋放 ...