C: 我可以用大小和地址对数组进行静态初始化吗?

C: Can I do static intialization of an array with both size and address?

(如何)通过同时指定地址和元素数量(“大小”)来初始化 C 数组?

使用元素计数进行静态初始化:

static int foo[4] = {0, 1, 2, 3};

这很好,因为人类 reader、linter 和编译器知道数组元素的数量。

静态初始化地址:

static int* foo = (int*)address_of_foo;

这不太好,因为元素的数量未知。

使用元素计数和地址进行静态初始化?

考虑将大型数组存储在其他地方(例如,在非源代码文件中或在嵌入式系统上的不同硬件寄存器中)。我知道这个数组的地址,也知道大小,但我想拥有在代码中指定大小的所有优点。这有可能吗?以下代码

static int foo[4] = (int*) address_of_foo;

编译失败,例如出现此错误:error: array initializer must be an initializer list.

是否有解决方案或 C 编译器不支持此方法?

你可以像这样有一个指向数组的指针:

/* casting to (void *) since i am to lazy to figure out the correct casting */
static int (*foo)[4] = (void *) address_of_foo;

对此的缩减是,您必须在使用数组元素时取消引用指针:

(*foo)[2] =42;
/* A good compiler should hopefully give you a warning on this: */
(*foo)[95] = 42;

如果您愿意,可以将取消引用隐藏在 #define 后面:

static int (*foo_ptr)[4] = (void *) address_of_foo;
#define foo (*foo_ptr)

foo[2]=42;

我个人觉得这两种解决方案都有点“hackish”,所以我自己不会使用它们