野指標產生的原因和避免方法

2021-07-04 16:05:07 字數 1517 閱讀 999

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;

同理:

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 使用完記憶體空間後釋放 ...