下面是我的代码。 请注意,我不是在普通机器上运行此代码,而是在架构模拟器(gem5)上运行。
#include <stdio.h>
int main()
{
int *p;
int x;
p = &x;
p[0] = 3;
// *(0xffff) = 6;
return 0;
}
如果我取消注释该行,则会收到编译器错误(这是预期的)“间接需要指针操作数”。 由于我不是在实际机器上运行它,而是在模拟器上运行它,所以我可以控制硬件的行为和地址空间。 我想将值 6 存储在地址 0xffff 中。一种方法是:
int *p;
p = (int *)0xffff;
p[0] = 6;
请注意,这不会导致我出现段错误,因为我在模拟器上运行它,并且我控制地址空间。 但是,这是一种低效的方法,因为每次都应该访问变量“p”,获取 0xffff,然后存储 6。即使声明为寄存器,访问变量“p”也将花费 1 个周期,这对我来说是昂贵的运行。 因为我知道 'p' 总是有 0xffff,所以我不能写这样的东西
*(0xffff) = 3;
如何让编译器生成此代码? 任何指示都会有所帮助。
最佳答案
我不知道是否可以在没有指针的情况下完成它,但是如果您不想在单独的行上声明指针,您可以这样做:
*(int*)(0xffff) = 3;
关于c - 如何不使用指针直接访问内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47045747/