結構初值 初始化C中的int指針




struct介紹c (3)

正如Grzegorz Szpetkowski的回答所說,語法:

int *varname = {0};

已驗證。 它只是不做我認為你應該做的事情。 這相當於

int *varname = 0;

相當於

int *varname = NULL

(假設NULL是可見的)。

如果我對你想要做什麼的猜測是錯誤的,這個答案的其餘部分不適用。

根據評論,這看起來不是OP所要做的。 不確定是否刪除這個答案; 這可能是對其他問題的一個很好的答案。

你可以初始化一個char*指針來指向一個字符串文字:

char *cptr = "hello";

字符串文字"hello"隱式地創建一個具有靜態存儲持續時間的匿名數組對象; 初始化會導致cptr指向該數組的初始元素。

在C99之前,沒有用於定義非字符指針的同等語法,同時還創建了一些指向它的內容。

C99添加了複合文字 。 例如,這個:

(int){42}

創建一個值為42int對象。 與字面值42不同,這實際上創建了一個對象 ,而不僅僅是一個值 - 這意味著它有一個地址。 所以這:

int *iptr = &((int){42});

創建一個初始值為42的匿名int對象,並初始化iptr指向它。 (如果你的編譯器支持複合文字。)

複合文字通常用於數組和結構類型,但對於標量類型也是有效的。

有一點需要注意:由字符串文字創建的數組總是具有靜態存儲持續時間,這意味著它在整個程序執行期間存在。 由複合文字創建的匿名對象的存儲時間取決於它出現的位置。 如果它在一個函數內,那麼該對象具有自動存儲持續時間,這意味著只要執行離開最近的封閉塊,它就不再存在。

所以給出:

char *cptr = "hello";

你可以安全地從函數中返回cptr的值,並且它將繼續有效。 但是,鑑於:

int *iptr = &((int){42});

從函數返回iptr的值將是危險的,因為它指向的對象將在調用者獲取指針值之前不再存在。

做這種事情更簡單的方法是自己定義對象:

int obj = 42;
int *iptr = &obj;

如果需要,可以將obj定義為static

關於在C中初始化一個int指針的一個非常簡單的問題我剛剛告知

int *varname = {0};  

無效。

我還沒有能夠找到明確的參考指出這一點,但有信心(基於評論者代表),它可能是無效的,即使它編譯,建立並從calloc / malloc聲明接受內存好。

有人可以指出為什麼上述表達式無效的具體情況?


的:

int *varname = {0};

相當於:

int *varname = 0;

它是NULL對像類宏的有效替代之一(或者是0整型常量,或者是這樣的常量,轉換為void *類型)。

N1570(C11草案),6.3.2.3/3:

一個整數常量表達式的值為0,或者這樣一個表達式類型為void * ,被稱為空指針常量如果一個空指針常量被轉換為一個指針類型,那麼稱為空指針的結果指針被保證進行比較不等於指向任何對像或函數的指針。

示例( http://ideone.com/9917zk ):

#include <stdio.h>

int main(void)
{
    int *varname = {0};

    printf("%p\n", (void *) varname);

    return 0;
}

它的輸出只是:

(nil)

(作為獎勵的一部分注意, nil期限是由Alfred Tarski發明的)


這是有效的,我們可以看看這個去C99草案標準部分6.7.8 初始化11段說:

標量的初始值應該是一個單獨的表達式,可以用大括號括起來。 [...]

所以:

int *varname = {0}; 

將初始化varname為一個空指針 ,因為0是一個空指針常量 ,按照6.3.2.3指針

一個整數常量表達式的值為0,或者這樣一個表達式強制類型為void *,被稱為空指針常量。如果一個空指針常量被轉換為一個指針類型,那麼結果指針被稱為空指針[。 ..]

為了完整起見,我們知道指針是基於6.2.5 類型的標量類型

算術類型和指針類型統稱為標量類型[...]







initialization