在C语言中构造特定地址的数组

4
我想在特定地址addr创建一个整数数组array[3],并使用{1, 3, 6}进行初始化。我该怎么做?
int addr = 0x40000;
((int *)addr)[3] = { 1, 3, 6 }; //Error
1个回答

7

你无法在该位置初始化数组,甚至无法声明存在一个数组。

但是,你可以使用指针来操作已经存在于该位置的值。

事实上,你已经很接近了:

int* addr = (int*)0x40000;
addr[0] = 1;
addr[1] = 3;
addr[2] = 6;

从技术上讲,这可能会产生未定义的行为,具体取决于这个0x40000来自哪里:执行指针算术(包括通过数组下标进行)需要您导航到一个对象或对象数组,该对象或对象数组必须由您的程序创建:如果您的整数是由其他进程创建的(尽管虚拟内存可能),例如,如果您正在内存映射某些硬件寄存器,则不完全如此。但是,它将在基本所有硬件上运行,并且是一种常见的技术。
但是,如果在0x40000处当前不存在任何内容,并且您正在尝试指定将分配新的C数组的位置,则不可以这样做。

4
这种技术在嵌入式系统中非常有用,因为你可以精确地知道给定地址上的内容(如内存映射I/O,Flash页面等)。但对于普通的桌面系统来说,编写这样的代码几乎肯定会带来灾难性后果。 - AShelly
1
有时候你会想把指针声明为volatile,例如volatile int *addr = (volatile int*)0x40000;。如果值可以在应用程序上下文之外改变或者设置一个值会触发某种硬件操作,那么这是非常有用的。 - EricS

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