我正在尝试使用指定的初始值设定项来初始化const struct。但是,其中一个struct元素是固定宽度的数组。我已经在另一个大小合适的固定宽度数组中拥有了要用来初始化数组的内容。
有没有办法用一个指定的初始化器来做到这一点?下面演示了我试图实现的一个简单(失败的示例)。
struct foo {
uint8_t array1[4];
uint8_t array2[4];
}
uint8_t array[4] = {
1, 2, 3, 4
};
struct foo const bar = {
.array1 = array, // incompatible pointer to integer conversion
.array2 = { *array } // only copies the first element
};发布于 2013-11-22 08:37:57
简而言之:不能。C不复制数组(不使用(标准库-)函数)。警告来自这样一个事实,即您不能将数组作为一个整体赋值,即使它们是静态的或常量的。当一个数组被用作赋值中的r值时,它会衰减为一个指针,因此不能(作为一个整体)赋给另一个数组。
最简单的方法是使用memcpy,但显然它必须在函数中。
发布于 2013-11-22 09:33:03
如果bar具有全局作用域,或者被声明为static,那么您将不能使用指定的初始化器从非立即值进行初始化,而不管相关的成员是否为数组。
但是,如果:
那么你也许可以用下面这样的方式逃脱惩罚:
#include <stdio.h>
#include <stdint.h>
struct foo {
uint8_t array1[4];
uint8_t array2[4];
};
#define ARRAY_INIT(a) { a[0], a[1], a[2], a[3] }
int main (int argc, char **argv) {
uint8_t arr_init[4] = {
1, 2, 3, 4
};
struct foo const bar = {
.array1 = ARRAY_INIT(arr_init),
.array2 = ARRAY_INIT(arr_init),
};
printf("%d, %d\n", bar.array1[0], bar.array2[3]);
return (0);
}初始值设定项数组必须出现在堆栈帧中要初始化的值之前。或者它可能来自一个函数参数。
当然,如果您的数组比这个数组大得多,那么使用这样的宏确实会变得非常混乱。
https://stackoverflow.com/questions/20134563
复制相似问题