c - 如何不使用指针直接访问内存地址?

标签 c pointers

下面是我的代码。 请注意,我不是在普通机器上运行此代码,而是在架构模拟器(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/

相关文章:

c - 使用指针的 for 循环优化

arrays - 结构体数组成员地址问题

c - 使用 free() 释放内存,其指针位于指向结构的指针内

c - 打印出头文件中定义的指针数组

C中的自定义字符编码

c++ - 如何使用 C 中的内部 C++ 类类型?

c - libpcap - pcap_findalldevs 在 MacOSx 上返回 NULL

c - 对不同结构类型的指针进行类型转换是否合法(例如,将 struct sockaddr * 转换为 struct sockaddr_in6 *)?

使用 while 循环计算输入中的字符

c - 不带链接的类型用于声明带链接的函数