为什么:
const char example;
(uint64*)example
的值为140734799798420
和
*(uint64*)example
的值为7004431430466964258
P.S。不要担心类型转换,我感兴趣为什么第二个*
增加了值。
由于
答案 0 :(得分:8)
您的代码提供了未定义的行为。你的第二行非法地将一个字符转换为指向uint64的指针(很可能是一个无效的指针)。您的第三行尝试取消引用此无效指针。
询问为什么它做它的功能是没有意义的 - 它可以在不同的机器上做不同的事情,并且在下一版本的编译器中行为可能会改变。
就是不要这样做。
答案 1 :(得分:4)
正如其他人所说,你已经调用了未定义的行为。没有特别的行为可以保证。
也就是说,您会看到不同的值,因为您在内存中打印不同的位置 - 第一个打印数据来自存储example
的内存位置,第二个打印存储位置的数据作为example
的值。
const char example
在堆栈上定义char
变量而不初始化它,因此它的值将是垃圾;可能是最后存储在堆栈中分配位置的任何内容。
(uint64 *)example
将example
的值解释为指向uint64
(的地址)的指针。这会打印出example
中存储的值,就好像它是指针一样。
*(uint64 *)example
取消引用指针。它将example
的值解释为指向uint64(的地址)的指针,然后打印该地址处的内容,就好像它是uint64一样。