C語言知識彙總| 56-C語言NULL空指標以及void指標 - IT人
文章推薦指數: 80 %
NULL 是“零值、等於零”的意思,在C語言中表示空指標。
從表面上理解,空指標是不指向任何資料的指標,是無效指標,程式使用它不會產生效果。
Togglenavigation
IT人
IT人
C語言知識彙總|56-C語言NULL空指標以及void指標
Neutionwei發表於
2020-10-01
一、NULL空指標
一個指標變數可以指向計算機中的任何一塊記憶體,不管該記憶體有沒有被分配,也不管該記憶體有沒有使用許可權,只要把地址給它,它就可以指向,C語言沒有一種機制來保證指向的記憶體的正確性,程式設計師必須自己提高警惕。
很多初學者會在無意間對沒有初始化的指標進行操作,這是非常危險的,請看下面的例子:
#include
如果你足夠幸運,或者輸入的字串少,也可能不報錯,這都是未知的。
未初始化的區域性變數的值是不確定的,C語言並沒有對此作出規定,不同的編譯器有不同的實現,因此不要直接使用未初始化的區域性變數。
上面的程式碼中,str就是一個未初始化的區域性變數,它的值是不確定的,究竟指向哪塊記憶體也是未知的,大多數情況下這塊記憶體沒有被分配或者沒有讀寫許可權,使用gets()函式向它裡面寫入資料顯然是錯誤的。
建議對沒有初始化的指標賦值為NULL,例如:
char*str=NULL;
NULL是“零值、等於零”的意思,在C語言中表示空指標。
從表面上理解,空指標是不指向任何資料的指標,是無效指標,程式使用它不會產生效果。
注意區分大小寫,null沒有任何特殊含義,只是一個普通的識別符號。
很多庫函式都對傳入的指標做了判斷,如果是空指標就不做任何操作,或者給出提示資訊。
更改上面的程式碼,給str賦值NULL,看看會有什麼效果:
#include
我們有理由據此推斷,gets()和printf()都對空指標做了特殊處理:
gets()不會讓使用者輸入字串,也不會向指標指向的記憶體中寫入資料;printf()不會讀取指標指向的內容,只是簡單地給出提示,讓程式設計師意識到使用了一個空指標。
我們在自己定義的函式中也可以進行類似的判斷,例如:
voidfunc(char*p)
{
if(p==NULL){
printf("(null)\n");
}else{
printf("%s\n",p);
}
}
這樣能夠從很大程度上增加程式的健壯性,防止對空指標進行無意義的操作。
其實,NULL是在stdio.h中定義的一個巨集,它的具體內容為:
#defineNULL((void*)0)
(void*)0表示把數值0強制轉換為void*型別,最外層的()把巨集定義的內容括起來,防止發生歧義。
從整體上來看,NULL指向了地址為0的記憶體,而不是前面說的不指向任何資料。
在程式的虛擬地址空間中,最低地址處有一段記憶體區域被稱為保留區,這個區域不儲存有效資料,也不能被使用者程式訪問,將NULL指向這塊區域很容易檢測到違規指標。
在大多數作業系統中,極小的地址通常不儲存資料,也不允許程式訪問,NULL可以指向這段地址區間中的任何一個地址。
注意,C語言沒有規定NULL的指向,只是大部分標準庫約定成俗地將NULL指向0,所以不要將NULL和0等同起來,例如下面的寫法是不專業的:
int*p=0;
而應該堅持寫為:
int*p=NULL;
注意NULL和NUL的區別:NULL表示空指標,是一個巨集定義,可以在程式碼中直接使用。
而NUL表示字串的結束標誌'\0',它是ASCII碼錶中的第0個字元。
NUL沒有在C語言中定義,僅僅是對'\0'的稱呼,不能在程式碼中直接使用。
二、void*指標
對於空指標NULL的巨集定義內容,上面只是對((void*)0)作了粗略的介紹,這裡重點說一下void*的含義。
void用在函式定義中可以表示函式沒有返回值或者沒有形式引數,用在這裡表示指標指向的資料的型別是未知的。
也就是說,void*表示一個有效指標,它確實指向實實在在的資料,只是資料的型別尚未確定,在後續使用過程中一般要進行強制型別轉換。
C語言動態記憶體分配函式malloc()的返回值就是void*型別,在使用時要進行強制型別轉換,請看下面的例子:
#include
。
膜拜。
。
MovaviPicverseforMac(專業照片編輯軟體)
Mac電影特效合成軟體:NUKE13
物聯網開源開發平臺Shifu開放內測!第一版技術文件釋出
延伸文章資訊
- 1C語言野指標與空指標專篇解讀 - IT145.com
1. 指標未初始化:指標變數剛被建立時不會自動成為NULL指標,它的預設值是隨機的,它所指的空間是隨機的。 程式碼 ...
- 2C語言空指標NULL - C語言零基礎入門教程_其它 - 程式人生
目錄一.指標簡介二.空指標NULL 三.關於NULL 和0 四.猜你喜歡零基礎C/C++ 學習路線推薦: C/C++ 學習目錄>> C 語言基礎入門.
- 3如何在C++ 中檢查指標是否為空指標 - Delft Stack
++ cCopy #include <iostream> using std::cout; using std::endl; #define SIZE 123 int main() { char...
- 4C 語言常見誤解/指標/空指標與NULL - 维基教科书,自由的教学 ...
C 語言常見誤解/指標/空指標與NULL. 语言 · 监视 · 编辑. < C 語言常見誤解 ...
- 5C語言空指標 - w3c學習教程
C語言空指標 · 空指標 · :不指向任何資料的指標,用null表示; · 典型用法:malloc函式,當分配記憶體失敗時就會返回空指標,因而空指標絕對不等同於未初始化的 ...