2013-12-23 71 views
-2

我有一些問題,當我正在閱讀和編寫代碼時出現..
我已經得到另一種方法,但這個問題仍然在我的腦海裏,我沒有找到任何好的答案,讓我們看看:NULL實現和指針分配

  1. 我可以分配一個指針變量在便攜方式,甚至失去 信息?看到的情況,我有一個函數,可以返回NULL,如果一個錯誤或一個字符,假設NULL是全0,字符 將是nul,這是正確的?

    void * function_returning_null_or_char(); 
    
  2. 一個int變量是否設想保存一個指針? (我在某處讀過)..

  3. 我的NULL實現是#define NULL (void *) 0。如果是#define NULL 0,會更好嗎?所以 它可以分配給變量和指針,如char或int *。 (請參閱問題1)

  4. 當我將一個指針指向NULL時,當我將它轉換爲short或char 或另一個類型時,值將爲0?或者值將會是 特殊值的NULL,以適合該類型?

我認爲,所有問題都在恢復: 編譯器是足夠聰明,當它被強制轉換爲一個變量在0 NULL指針轉換?

示例代碼:

int *p = NULL; 

    char c = (char) p; // This works, I dont know why, and char is equal to '/0'; 

    char c = NULL; //This works because the compiler is smart to convert NULL to '/0' event stddef.h defining NULL as (void *)0; 

    char c = (char) function_returning_null_or_char(); //if this function return NULL whats the value of c? If NULL have a special value, c will have a special value too, or it will be 0? 
+5

你爲什麼重新定義NULL? –

+1

你只是過於複雜的東西... – JoeC

+0

我沒有重新定義任何東西,這是在stddef.h – drigoSkalWalker

回答

3
  1. 它沒有意義的,具有可以返回NULL(指針值)或char值的函數。有一個空字符'\0',但它與空指針無關。有多種方法可以使函數返回一個char的值,或者表示沒有有效的值。例如,返回一個結構。

  2. 不,int變量不應該保存指針。一個int變量保存一個整數值;拿着一個指針,使用一個指針變量。 (您可以整型和指針類型之間轉換,但這樣做是有道理的遠不往往比你想象的。)

  3. NULL被執行爲您定義,在<stddef.h>和其他幾個標準的頭。不要試圖自己重新定義它。

  4. 將空指針值轉換爲整數類型會生成實現定義的值。如果你關心那個價值是什麼,你可能做錯了什麼。

指針不是整數;不要試圖把它們當作整數。空指針的表示是實現定義的;它通常是全零位的,但不能保證。

查看comp.lang.c FAQ,特別是第4部分(指針)和第5部分(空指針)。

+0

感謝您的答案,我已經看過comp.lang.c之前問,這就是錯誤,因爲,C++實現NULL爲0,C實現NULL爲(void *)0。我想知道這將是更好的C來實現NULL爲0,因爲它將對指針和nul字符都有用。 – drigoSkalWalker

+1

@drigoSkalWalker; C!= C++。 – haccks

+1

'NULL'不應該用於引用空字符;它是一個空*指針*常量。 C實現可以將'NULL'定義爲'((void *)0)'外部括號是必須的)*或*爲'0',或者以任何其他形式定義。 C++是一種不同的語言,對空指針常量有不同的要求,C++實現通常將NULL定義爲'0'。由實現定義'NULL'的意義在於,你不必關心它是如何定義的。 –