2

我刚刚开始学习 C++,所以我可能对这个不太满意,但对我来说放轻松。

我想要做的是写入我指定的内存地址 - 如果可能的话?

我正在使用的代码是:

#include <iostream>

int main()
{
    using namespace std;

    int i = 100;
    int* p = &i;
    cout << p << "\n";
    cout << "Writing" << "\n";
    int* w = (int*)0x28ff18;
    *w = 101;
    cout << *p << "\n" << "Done";
    return 0;
}

我得到的地址i0x28ff18,那么是否可以通过指定此地址来写入该位置?而不是使用*p = 101. 显然我正在使用的东西并没有改变它,我不知道它在哪里或是否在写101

非常感谢任何简单的解释或帮助。

4

3 回答 3

4

在大多数计算机和大多数编译器上,这样的事情可能会起作用。但是 C++ 标准对此没有任何保证。

例如,当我在 Windows 机器上使用 MSVC++ 编译和运行您的代码时,每次地址都不同。您不能期望它在同一程序的不同运行之间是相同的。

另请注意,您存储指针值的整数应该足够大(例如,当您有 64 位指针时是 64 位整数)。如果您想这样做,请使用 uintptr_t(感谢 larsmans 指出这一点)。

于 2012-05-30T15:48:16.697 回答
3

的地址i可能与程序的一次运行到下一次不同。这是非常不安全的。请不要这样做;内存地址隐藏在 C++ 中的指针抽象背后是有原因的。

您会看到内存地址文字的唯一地方是非常小的嵌入式系统和操作系统内核/驱动程序。

于 2012-05-30T15:38:27.070 回答
3

尽管可以写入特定的内存位置,但这并不一定意味着这样做是安全的。

在您拥有整个内存空间的环境(特别是嵌入式系统)中,写入特定内存地址以执行内存映射 I/O 操作是很常见的。在操作环境控制您的内存空间的情况下,写入任何尚未分配给您的程序的内存是不安全的。

于 2012-05-30T15:39:05.540 回答