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”,所以我自己不会使用它们
(如何)通过同时指定地址和元素数量(“大小”)来初始化 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”,所以我自己不会使用它们