如何在C语言中写入特定地址的数据

6

我需要在地址0x8000000写入0x00001234,这在C语言中是否可行?


1
那个地址可能不适合写入。如果您使用的是 POSIX 操作系统,您可以尝试使用 mmapMAP_FIXED 强制其存在。 - BoBTFish
6
也许他正在为微控制器编程。 - RedX
你需要这个做什么?为什么?用什么? - zoska
3个回答

18

如果你在嵌入式系统中使用硬件寄存器,则标准方法是:

int volatile * const p_reg = (int *) 0x8000000;
*p_reg = 0x1234;

如果你忽略了volatile,那么在优化编译器方面可能会遇到很多问题。


8
您可以这么做,但99.9999..9%的时间会出现段错误,因为您的程序无法访问该内存地址。
int *nb = (int *) 0x8000000;
*nb = 0x00001234;

它还取决于你的链接器脚本(你可以省略一些RAM bank并手动使用它们),尽管这并不推荐。 - lucasg

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位,因此无法访问超出当前内存段的内容。
我们曾经通过直接写入视频内存来实现自己的printf。这是十多年前C编程课程中的一个班级作业。也许它符合您的情况。
这个解释也可能会有所帮助。

这不是一个初学者的任务.. :) - vkulkarni
同意,在编程课程开始时给出的不是非常“初学者”的内容。但它肯定不符合实际需求,即使在那个时候也是如此。然而,它有助于理解内存、指针和能够自己编写函数。因此,它更多地是用于学术目的。 - fkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接