指针总是显示相同的值 C++
Posted
技术标签:
【中文标题】指针总是显示相同的值 C++【英文标题】:Pointer always shows the same value C++ 【发布时间】:2021-10-17 22:18:31 【问题描述】:这没什么问题,但是,我有一个 C++ 程序,我想打印一个变量(指针)的内存地址,但它总是显示相同的值。
这是我的代码的 sn-p
#include <iostream>
int main()
int a = 90; // any random value returns the exact same pointer
int* b = &a;
std::cout << b++ << std::endl;
// returns only one and the same value even on recompilation, which is 0x61ff08 neither does setprecision do any thing
std::cout << *b << std::endl;
/* trying to get some random values from memory but it also shows the same value which is 6422284 */
// EDIT: I purposely made it like this to get some random value from the memory whenever it is executed
尝试重新编译并再次执行,但它给出了相同的输出(即使在重新编译时也是如此)。
事实上,当我在我的 linux 虚拟机上尝试这个时,它总是在每次执行时给出不同的随机值。 我在我的真机上使用 Win10,使用 g++ 作为编译器,没有任何优化标志,并且对 C++ 编程相当陌生。
只是想知道这是 Windows 特有的事情,还是由于虚拟机显示不同的值而指针总是具有相同的值? 和 如果这应该返回一个随机值,那么为什么它在 Win10 上不起作用。
【问题讨论】:
这是一个未定义的行为,它取决于操作系统内核如何为您的进程分配内存。可能你的系统内存不忙。*b
调用未定义的行为,因为 b
未指向有效内存
"如果这应该返回一个随机值,那么为什么它不能在 Win10 上运行。"从技术上讲,这不是 C++ 的问题:C++ 完全不知道底层内存的样子,如果它是随机的,......
【参考方案1】:
这取决于内核。确切地说是地址空间布局随机化(ASLR),用于阻止缓冲区溢出攻击。不知道Win10的具体情况,linux一般默认开启ASLR
在一个非常基本的概述中,当程序被加载时,它会有几个部分。 .text
代码所在的位置、动态库的部分、堆和堆栈(还有其他部分)。现在这些最初被放置在内存中虚拟地址空间的相同位置(即程序中的指针指向的位置)。这允许人们潜在地溢出缓冲区,并触发可能的恶意副作用。 ASLR 会随机化加载到内存中的确切位置,因此触发这些恶意副作用要困难得多。
然而,除了 ASLR,还有其他保护措施(编译器警告危险的函数调用,如 gets
、堆栈 cookie、不可执行堆栈等),因此缺少 ASLR 应该不是问题。 This 建议 Windows 仅对以这种方式显式编译的应用程序启用 ASLR,但 wikipedia 可能有点不可靠,这看起来像是相当古老的信息。
【讨论】:
以上是关于指针总是显示相同的值 C++的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中循环读取 QML 对象(CheckBox)属性:总是相同的值