用C語言編程不能不說指針,說道指針又不能不提NULL,那么NULL究竟是個什么東西呢? C語言中又定義,定義如下:
#undef NULL #if defined(__cplusplus) #define NULL 0 #else #define NULL ((void *)0) #endif
所以我覺得,如果一個指針被賦予NULL,應該就相當於這個指針執行了0x0000這個邏輯地址,但是C語言中0x0000這個邏輯地址用戶是不能使用的(有些人說是因為0x0000沒有映射到物理地址,也有人說是因為0x0000映射到的地址是操作系統用於判斷野指針的,我也不太懂,總之就是用戶不能使用啦),所以當你試圖取一個指向了NULL的指針的內容時,就會提示段錯誤,聽着有點繞,看程序:
int *node=NULL; int a=0; a=*node;
printf("%d\n",a);
由於node執行的是NULL,也就是邏輯地址0x0000,而這個地址用於是不能訪問的,所以編譯器提示段錯誤。
還在網上看到了一個面試題,和這個問題有關,分享一下:
#include <stdio.h> void fun(int *node) { static int N=100; node=&N; } int main() { int *node=NULL; int a=0; fun(node); a=*node; printf("%d\n",a); return 0; }
運行結果依然是段錯誤。因為函數是值傳遞,node指針變量的值並沒有被改變,所以這個程序的效果和上一個程序的效果是一樣的。
如果要讓結果為100,應該怎樣寫代碼呢? 答案是 傳遞node指針變量的指針給fun,也就是傳遞一個二級指針,當然相應的fun函數也應該做出改變,代碼如下:
#include <stdio.h> void fun(int ** node) { static int N=100; *node=&N; } int main() { int *node=NULL; int a=0; fun(&node); a=*node; printf("%d\n",a); return 0; }
就寫到這里,希望對大家有幫助。不對的地方還請指正。謝謝~~~