我正在尝试以下代码:
unsigned long * foo = (unsigned long *) 0x200000;
所以,据我所知,foo指向无符号长0x200000。现在,如果我尝试,
std::cout<<foo[0];
我认为这应该打印值0x200000
(可能是十进制)。因为,foo[0] = *(foo + 0) = 0x200000
。
但是,它实际上会打印0
。
我在这里缺少什么?
答案 0 :(得分:5)
你误解了,
unsigned long * foo = (unsigned long *) 0x200000;
将0x200000解释为unsigned long
的地址。由于您在程序中可以合法访问unsigned long
的地址极不可能,
std::cout<<foo[0];
几乎肯定是未定义的行为,可能会导致段错误。但是,在您的情况下,访问该内存位置不会导致段错误,并且那些位被解释并打印为unsigned long
,它们恰好都是0。
答案 1 :(得分:0)
type * pointerName = addressItPointsTo;
pointerName[0]
与*pointerName
相同,意味着取消引用指针并获取其指向的地址的值。它恰好是0,但它通常会导致分段错误。