2
爲什麼這個程序:錯誤指針
#include <stdio.h>
#include <Foundation/NSDate.h>
int main() {
printf("%p\n", [NSDate distantPast]);
return 0;
}
回報在64位機器壞指針? (0xc22d63c8c500000d在我的情況)
爲什麼這個程序:錯誤指針
#include <stdio.h>
#include <Foundation/NSDate.h>
int main() {
printf("%p\n", [NSDate distantPast]);
return 0;
}
回報在64位機器壞指針? (0xc22d63c8c500000d在我的情況)
這是一個標記指針 - 這些有最低有效位集,其他位包含類型和值。它們爲某些類型提供了一種緊湊的表示形式,避免了內存分配。欲瞭解更多詳情,請參閱Mike Ash's blog article
太好了,就是這樣!謝謝。 – clavijo
你怎麼知道它不好? – Sven
因爲如果我嘗試從gdb(x/32x)檢查內存,我得到'無法訪問地址0x ...處的內存'錯誤。 –
clavijo
它是**標記的指針**,因爲地址是*奇*號('... 000d')。將奇數地址解引用到除char之外的任何地址都會導致segfault(或者可能是總線錯誤)和轉儲核心。標記指針將信息存儲在指針本身中。 –