我刚刚开始学习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;
}
我为i
获取的地址是0x28ff18
,因此可以通过指定此地址来写入该位置吗?而不是使用*p = 101
。显然我正在使用的不会改变它,我不知道它在哪里或是否在写101
。
非常感谢任何简单的解释或帮助。
答案 0 :(得分:4)
在大多数计算机和大多数编译器上,这样的东西可能会起作用。但是C ++标准并不保证这一点。
例如,当我在Windows机器上使用MSVC ++编译和运行代码时,每次地址都不同时。你不能指望它在同一个程序的不同运行之间是相同的。
另请注意,存储指针值的整数应足够大(例如,当您有64位指针时,为64位整数)。如果你想这样做,请使用uintptr_t(感谢larsmans指出这一点)。
答案 1 :(得分:3)
i
的地址可能与程序的一次运行不同。这是非常不安全的。请不要这样做;有一个原因可以解释为什么内存地址隐藏在C ++中的指针抽象之后。
您将看到内存地址文字的唯一地方是非常小的嵌入式系统和操作系统内核/驱动程序。
答案 2 :(得分:3)
虽然可以写入特定的内存位置,但并不一定意味着这样做是安全的。
在拥有整个内存空间(特别是嵌入式系统)的环境中,通常会写入特定的内存地址来执行内存映射的I / O操作。在操作环境控制您的内存空间的情况下,写入尚未分配给您的程序的任何内存是不安全的。