二級指標和野指標

2021-09-30 16:21:46 字數 1318 閱讀 7902

1. 關於二級指標

例如:char **p;

這裡定義了乙個二級指標變數p,p是乙個指標變數,毫無疑問在32位系統下佔4個byte。

它與一級指標不同的是,一級指標儲存的是資料的位址,二級指標儲存的是一級指標的位址,布局如下:

2.「陣列引數」和等效的「指標引數」

a. void fun(char a[3][4]); 等效為:void fun(char (*p)[4]);

b. void fun(char *a); 等效為:void fun(char **p);

c語言中,當一維陣列作為函式引數的時候,編譯器總是把它解析成乙個指向其首元素首位址的指標。

3. 常見的記憶體訪問錯誤及對策

a.野指標:指標沒有指向一塊合法的記憶體,屬於沒有人「看管」狀態,如果想它處於「被看管」狀態,需要把它初始化為「null」,這個0位址處的地方就相當於一根繩子把它繫結好了,不許亂動。

eg: 結構體成員指標未初始化

struct student

stu,*pstu;

int main(void)

編譯時,沒有出現錯誤,但在執行時出現中斷異常。這裡定義了結構體變數stu,但是沒有想到這個結構體內部的char *name這個成員在定義結構體變數stu時,只是給name這個指標變數本身分配了4個位元組。name指標並沒有指向乙個合法的位址,這個時候,其內部存的只是一些亂碼。所以在呼叫strcpy函式時,會將字串"jimy"往亂碼所在的記憶體中拷貝,而這塊記憶體name指標根本就無權訪問,導致出錯。解決方法:為name指標malloc一塊空間。

下面這個方法也是不正確的:

int main(void)

這裡為指標變數pstu分配了記憶體,但是同樣沒有給name指標分配記憶體。

正確方法:

int main(void)

b. 關於free();

我們在進行了malloc函式之後,一定要把記憶體經行釋放,否則這個記憶體將一直伴隨程式,一直到程式結束,造成不安全因素。使用free函式的時候一定要注意把指標變數置為null,因為使用free函式之後,指標變數p本身儲存的位址並未改變,只是p所指向的記憶體被釋放。

eg:char *p = (char*)malloc(100);

strcpy(p,"hello");

free(p);

//未起到防護作用

if(null != p)

這裡在釋放完記憶體之後,沒有把指標置為null,這個指標就成為了「野指標」,這是很危險的,一定記住要在free之後,把相應指標置為null。

一級指標和二級指標

通常用作函式的輸入引數,因為一級指標作為函式引數,在呼叫的時候,實參和形參是不同的記憶體空間,只是,這個記憶體空間存放的指標指向的是同一塊位址,所以形參在函式執行中可以訪問實參指向的記憶體空間,但是形參的指向的改變並不能影響實參。總結一句話 一級指標做函式引數,在函式內做形參做重新指向並 不會影響實...

指標與二級指標

int num 10 int p1 int p2 p1 指標的指向結構如下圖所示 0x4000 0x3000 p2 0x2000 p1 num p2 表示的是儲存p2指標的位址 p2 表示的是p2指向的位址,即指標p1存放的位址 p2 表示指標p2指向位址中所存的值,即指標p1指向的位址,即變數nu...

new和二級指標

new動態分配儲存空間如 int p new int int p new int 10 動態陣列的大小可以是變數或常量 而一般直接宣告陣列時,陣列大小必須是常量 又如 int p1 new int 10 動態分配用於存放整型資料的記憶體空間,將初值10寫入該記憶體空間,並將首位址值返回指標p1 do...