C中的野指標 如何避免

2021-06-26 07:08:09 字數 1153 閱讀 7145

先看乙個例子:

struct

student

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;

如何避免野指標?

野指標是指隨機訪問了記憶體空間,歸根到底是由於不良的編碼習慣,有個良好的程式設計習慣是避免 野指標 的唯一方法。如何避免野指標 1 初始化 char p null 為何賦值為 null 一是null 是乙個巨集,高亮,檢查段錯誤的時候比較顯眼。二是 null 為值,不能對 null 值賦值或者訪問。...

野指標如何避免

先看一段 struct student stu,pstu int main void 這是很多人都容易犯的錯誤 定義了結構體變數stu,但結構體內部的char name在定義結構體時只是為其分配了4位元組的記憶體,沒有指向乙個合法的位址,這時其指標指向的區域只是一些亂碼,有事還沒有訪問許可權。這就是...

什麼是野指標?如何避免野指標?

野指標不是 null指標,它是隨即指向一塊記憶體的指標。野指標是很危險的,會導致記憶體洩漏,if語句對它不起作用。導致野指標的原因有兩種 1 野指標指向了一塊沒有訪問許可權的記憶體。即指標沒有初始化 2 野指標指向了乙個已經釋放的記憶體。因為野指標是因為我們的不良程式設計習慣造成的,所以我們養成良好...