指针总是显示相同的值 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++ 指针和数据位置:数据总是被放置在相同的内存位置

当返回指向本地数组的指针时,为啥它总是相同的值?

检查每行C++的数组行中是不是总是有相同的值

在 C++ 中循环读取 QML 对象(CheckBox)属性:总是相同的值

类型转换 c++ 指针和非类型转换指针指向相同的位置,但给出不同的值

C++ 读取 LPCVOID 指针的值