先看一段**:
struct student
stu, *pstu;
int main(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;
如何避免野指標?
野指標是指隨機訪問了記憶體空間,歸根到底是由於不良的編碼習慣,有個良好的程式設計習慣是避免 野指標 的唯一方法。如何避免野指標 1 初始化 char p null 為何賦值為 null 一是null 是乙個巨集,高亮,檢查段錯誤的時候比較顯眼。二是 null 為值,不能對 null 值賦值或者訪問。...
什麼是野指標?如何避免野指標?
野指標不是 null指標,它是隨即指向一塊記憶體的指標。野指標是很危險的,會導致記憶體洩漏,if語句對它不起作用。導致野指標的原因有兩種 1 野指標指向了一塊沒有訪問許可權的記憶體。即指標沒有初始化 2 野指標指向了乙個已經釋放的記憶體。因為野指標是因為我們的不良程式設計習慣造成的,所以我們養成良好...
什麼是野指標?野指標的危害?如何避免野指標?
什麼是野指標?野指標是指隨機指向一塊記憶體的指標 野指標的危害?如何避免野指標?我們要在以後養成良好的編碼習慣 1.將沒有指向的指標初始化指向null 指向null的指標不能對他的指向進行修改 2.當想給乙個指標指向的空間賦值時,一定要給這個指標分配空間 malloc 3.當空間分配完後,要檢查這個...