2017-07-16 67 views
0

我讀過陣列桶值存儲在連續的內存位置。我試圖在我的64 bit mac作爲爲什麼打印顯示非連續地址的C數組?

char str1[] = "Hell"; 
    printf("%p:%lu:%c, %p:%lu:%c, %p:%lu:%c, %p:%lu:%c", str1[0], str1[0], str1[0], str1[1], str1[1], str1[1], str1[2], str1[2], str1[2], str1[3], str1[3], str1[3]); 

,我得到的結果打印的字符數組的內存位置被

0x48:72:H, 0x65:101:e, 0x7fff0000006c:140733193388140:l, 0x7fff0000006c:108:l 

這不會看起來像一個連續的內存地址給我,考慮到大小char1 byte。如果我學習錯了,請幫助我理解這一點。

+8

你不張貼代碼打印任何內存地址。 – axiac

+0

謝謝@axiac,我意識到我沒有把'操作符的地址'放錯了。如果你可以寫它作爲答案,我會接受它。用'&'測試,它正在工作。 – pkill

+2

Crank的警告級別,許多編譯器會警告你格式字符串和參數之間的不匹配。 – Deduplicator

回答

2

您的printf語句中的參數不正確。

如果你的意思是打印十進制地址,這裏是你應該寫什麼:

char str1[] = "Hell"; 
printf("%p:%lu:%c, %p:%lu:%c, %p:%lu:%c, %p:%lu:%c\n", 
     (void*)&str1[0], (unsigned long)&str1[0], str1[0], 
     (void*)&str1[1], (unsigned long)&str1[1], str1[1], 
     (void*)&str1[2], (unsigned long)&str1[2], str1[2], 
     (void*)&str1[3], (unsigned long)&str1[3], str1[3]); 

然而要注意的指針轉換爲unsigned long可能會失去信息的unsigned long的大小可能會小於一個char*(它在Windows 64位上);

如果你的意思是輸出十進制和字符的字符,格式應爲%d和代碼更改爲:

char str1[] = "Hell"; 
printf("%p:%d:%c, %p:%d:%c, %p:%d:%c, %p:%d:%c\n", 
     (void*)&str1[0], str1[0], str1[0], 
     (void*)&str1[1], str1[1], str1[1], 
     (void*)&str1[2], str1[2], str1[2], 
     (void*)&str1[3], str1[3], str1[3]);