gpt4 book ai didi

c++ - 获取指针的地址并为其赋值

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:25 26 4
gpt4 key购买 nike

我正在用 C++ 测试指针,我只是注意到当我做这样的事情时:

int main(){
int* test;
std::cout << test << std::endl;

return 0;
}

它会输出 0,当我这样做时:

int main(){
int* test;
&test;
std::cout << test << std::endl;

return 0;
}

它输出一个有效的内存地址。有谁知道为什么会发生这种情况?

最佳答案

tl;dr:编译器很复杂,未定义的行为允许它们做各种各样的事情。


int* test;
std::cout << test << std::endl;

在没有给定值的情况下以这种方式使用 test(即使只是评估它自己的值!)是不允许的,因此您的程序具有未定义的行为。

你的编译器显然使用这个事实来采取一些特定的路径。也许它假设一个零值,或者它准备优化掉变量并只留下一些硬编码的东西。它被任意选择为零,因为为什么不呢?标准未指定该值,所以没关系。

&test;

这是另一回事。取一个未初始化的东西的地址是完全合法的,所以你的程序的这方面是明确定义的。看起来这会触发编译器中的一条路径,该路径准备为指针创建实际的、诚实的存储空间。这种 odr-use 有效地阻止了任何优化机制。不知何故,这使它走上了一条不会触发“假装它为零”情况的道路,而您最终(可能)得到了一些实际的内存读取;该内存读取会导致您期望从输出未初始化的东西中获得未指定的值。

不过,该值仍然是“垃圾”。你表明你“可以”尊重它,你“可以”内存它,你“可以”使用它而不会触发段错误。但这一切都是错觉!不要“期望”使用无效指针会导致段错误。那只是一种可能的结果。操作系统不会检测到所有不良访问(除非您使用某种调试工具来检测),通常只检测那些跨越页面边界的访问等。

无论如何,上面的细节完全是推测,但它显示了可以进入具有未定义行为的程序的不同结果的各种因素。归根结底,尝试合理化此类代码没有多大意义,编写它当然也没有意义!

关于c++ - 获取指针的地址并为其赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59457099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com