我需要在地址0x8000000中写入0x00001234,是否可以在C?
中写入答案 0 :(得分:11)
如果您在嵌入式系统中使用硬件寄存器,那么标准方法是:
int volatile * const p_reg = (int *) 0x8000000;
*p_reg = 0x1234;
如果省略 volatile
,优化编译器可能会遇到很多问题答案 1 :(得分:9)
你可以,但你会有99.9999..9%的段错误,因为你的程序无法访问这个内存地址。
int *nb = (int *) 0x8000000;
*nb = 0x00001234;
答案 2 :(得分:0)
如果这是c类中的初学者分配,我怀疑它是turbo或borland c,你在16位环境中用段偏移地址方案进行编程。在这种情况下,使用 int * far ptr , far 是用于访问当前段之外的地址的指针类型。 0xb8000000曾经是文本模式视频内存的起始地址。
即
int far * p = 0xB8000000;
*p = 'A'; // This would actually print char 'A' on screen
*(p+1) = <some number>; // this would determine the color of char A
请注意,这曾经是16位编程。因此,正常的int *将是16位,因此无法访问当前的内存段。
我们曾经通过直接写入视频mem来实现我们自己的printf。十多年前,这是c编程课程中的一门课程。可能与您的情况相符。
This解释也可能有用