C語言中NULL的定義


用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;

}

 

就寫到這里,希望對大家有幫助。不對的地方還請指正。謝謝~~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM