【问题标题】:C++ pointer vs array and pointer castingC ++指针与数组和指针转换
【发布时间】:2012-10-04 18:49:10
【问题描述】:

我正在尝试以下代码:

unsigned long * foo = (unsigned long *) 0x200000;

所以,据我了解,foo 指向无符号长 0x200000。现在,如果我尝试,

std::cout<<foo[0];

我认为这应该打印值0x200000(可能是十进制)。因为,foo[0] = *(foo + 0) = 0x200000。 但是,它实际上打印了0

我在这里缺少什么?

【问题讨论】:

    标签: c++ arrays pointers casting


    【解决方案1】:

    你误会了,

    unsigned long * foo = (unsigned long *) 0x200000;
    

    将 0x200000 解释为 unsigned long 的地址。由于您可以在程序中合法访问的unsigned long 的地址极不可能,

    std::cout<<foo[0];
    

    几乎可以肯定是未定义的行为,并且可能导致段错误。但是,在您的情况下,访问该内存位置不会导致段错误,并且那里的位被解释并打印为 unsigned long,它们恰好全为 0。

    【讨论】:

    • “和地址”是什么意思?
    • 错字,应该是一个地址,不过地址可能更好。
    • 展示可能的修复也可能是说明性的,例如:unsigned long bar = 0x200000;无符号长 * foo = &bar;请注意,在这种情况下,应注意不要将指针 foo 复制到范围之外,超出 bar 和 dangling。该操作可能会从复习取消引用运算符 * 和地址运算符 & 中受益。
    【解决方案2】:
    type * pointerName = addressItPointsTo;
    

    pointerName[0]*pointerName 相同,表示取消引用指针并获取它指向的地址的值。它恰好是 0,但它通常会导致分段错误。

    【讨论】:

    • 它对unsigned long * foo = &amp;0x200000;有何反应?在同一场景中,0x200000 是否会像字符串文字一样被视为编译时常量,还是会以某种方式无效?在它之前需要const 吗? (目前无法测试)
    • @Ghost2 编写一个简单的程序并自己尝试。看看 compile 是如何获取常量地址的。