2013-06-06 111 views
2

爲什麼這個程序:錯誤指針

#include <stdio.h> 
#include <Foundation/NSDate.h> 
int main() { 
    printf("%p\n", [NSDate distantPast]); 
    return 0; 
} 

回報在64位機器壞指針? (0xc22d63c8c500000d在我的情況)

+1

你怎麼知道它不好? – Sven

+0

因爲如果我嘗試從gdb(x/32x )檢查內存,我得到'無法訪問地址0x ...處的內存'錯誤。 – clavijo

+3

它是**標記的指針**,因爲地址是*奇*號('... 000d')。將奇數地址解引用到除char之外的任何地址都會導致segfault(或者可能是總線錯誤)和轉儲核心。標記指針將信息存儲在指針本身中。 –

回答

4

這是一個標記指針 - 這些有最低有效位集,其他位包含類型和值。它們爲某些類型提供了一種緊湊的表示形式,避免了內存分配。欲瞭解更多詳情,請參閱Mike Ash's blog article

+0

太好了,就是這樣!謝謝。 – clavijo