2010-10-05 100 views
1

我還有一個新手C問題: 爲什麼結構的第一個成員返回的地址與初始化時沒有類似於結構自己的指針地址?C,結構的第一個成員

例子:

struct Metadata { 
    int message_ID; 
    //other members... 
    //... 
}; 

struct Metadata* baseMetadataPtr = (struct Metadata*) malloc(sizeof(struct Metadata)*100); 

printf("baseMetadataPtr: %d\n", baseMetadataPtr); 
//consoll says "baseMetadataPtr: 2636496" 

printf("baseMetadataPtr->message_ID: %d\n", baseMetadataPtr->message_ID); 
//consoll says "baseMetadataPtr->message_ID: 2621636" 
+0

歡迎來到SO ..您可以使用頂部的1010按鈕格式化您的問題中的代碼。 – Naveen 2010-10-05 04:53:51

+0

樣式細節:如果您的'printf'支持它,請使用'%p'作爲指針的打印說明符而不是像'%d'這樣的整數說明符。 – dmckee 2010-10-05 04:59:04

回答

8

你的第二個電話printf是錯誤的。它應該是:

printf("baseMetadataPtr->message_ID: %p\n", &baseMetadataPtr->message_ID); 
//   need to use %p for pointer^ ^need unary-& operator 

正如現在寫的,正在打印的message_ID的整數值。您需要取得baseMetadataPtr->message_ID的地址。另請注意,如果要打印指針,則應使用%p格式說明符,而不是%d(它會打印一個整數)。

結構類型對象的第一個數據成員的地址將始終與結構類型對象本身的地址相同。這是有保證的,因爲在結構的開始處不允許填充(雖然在數據元素之間或結構的末尾處允許填充)。

+0

啊,我明白了。謝謝。但是,如果不使用& - 操作員,寫入consoll的值是多少? – DoggyDoo 2010-10-05 04:56:17

+1

Err..'message_ID'不被解釋爲一個指針,直到他使用'%p'說明符。現在'baseMetadataPtr'被解釋爲一個十進制整數... – dmckee 2010-10-05 04:56:59

+1

@DoggyDoo:無論垃圾數據是從'malloc'指針返回的指針所在的內存塊中。 – 2010-10-05 04:57:19

0

這將打印指針的內存地址:

printf("baseMetadataPtr: %d\n", baseMetadataPtr); 

這種打印結構內部的變量的內存地址:

printf("baseMetadataPtr->message_ID: %d\n", &baseMetadataPtr->message_ID); 

這就是爲什麼他們都沒有鄰居。

0

baseMetadataPtr->message_ID打印變量message_ID。由於您尚未初始化它,因此它包含垃圾。要打印它的地址,你需要做&baseMetadataPtr->message_ID。此外,您需要使用格式說明符%p來打印指針值。

0

第一個printf()打印指針IE的當前值,它指向的是什麼地址。

第二個printf打印元數據成員message_ID的值。要得到你想要的,請嘗試:printf(「baseMetadataPtr-> message_ID:%d \ n」,& baseMetadataPtr-> message_ID);

1

我喜歡繪畫。他們幫我「看」東西

struct Metadata *baseMetadataPtr; 
baseMetadataPtr = malloc(100 * sizeof *baseMetadataPtr); 

了,並且假設一個線性存儲器(下面的框),而忽略了不同對象的空間需求,我們有

 
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|... 
    ^^^^^^^ baseMetadataPtr 
    (of type (struct Metadata *)) 

    ******* ===========================> 
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|...|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|... 
    ^^^^^^^ baseMetadataPtr    ^^^^^^ ^^^^^^^ ^^^^^^^ ^^^^^ ^^ ... 
    (of type (struct Metadata *))  *baseMetadataPtr (struct Metadata) 
               *(baseMetadataPtr+1) 
                 baseMetadataPtr[2] 

而且,縮放在左邊的部分

 
    *baseMetadataPtr 
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|... 
    ^^^ Message_ID (type (int)) 
     ^^^^^^^ Message_Len (type (size_t)) 
       ^^^^ ... other members, followed by another object of type (struct Metadata)