在C中初始化结构内部const数组的最佳方法是什么?
typedef struct
{
float coefs[5];
} t_data;
const float ONETWOTHREEFOURFIVE[5] = {1,2,3,4,5};
void init(t_data* data)
{
data->coefs[0] = ONETWOTHREEFOURFIVE[0];
data->coefs[1] = ONETWOTHREEFOURFIVE[1];
...
}
在现实世界中,我有超过5个元素。
有更好的方法吗?
答案 0 :(得分:4)
假设您确定尺寸相同,则可以使用memcpy
。我也会对源数据进行本地化,因此不会不必要地污染范围:
void init (t_data* data) {
static const float srcData[] = {1,2,3,4,5};
assert (sizeof(data->coeffs) == sizeof(srcData));
memcpy (data->coeffs, srcData, sizeof(data->coeffs));
}
你会注意到我在那里也有一个assert
,这将使你能够及早发现是否构建的代码违反了两个阵列大小相同的假设。这样可以避免读写缓冲区溢出。
答案 1 :(得分:1)
你的意思是初始化结构中的非const 数组,对吗?
我想你想要这个:
memcpy(data->coefs, ONETWOTHREEFOURFIVE, sizeof(ONETWOTHREEFOURFIVE));
答案 2 :(得分:0)
我的两分钱。假设您的t_data
可能包含的内容多于系数数组,您可以使用专用的holder-structure并避免任何循环或memcpy()
。
typedef struct {
float c[5];
} coef_holder;
static const coef_holder init_set = {
{ 1, 2, 3, 4, 5 }
};
typedef struct
{
coef_holder coefs;
/* more stuff */
} t_data;
void init(t_data* data)
{
data->coefs = init_set;
...
}
另请注意,这一行:
data->coefs = init_set;
不是初始化,而是一个赋值。当然,在某些体系结构上,这个赋值可以转换为对memcpy()
的调用,但无论如何源代码看起来更清晰。
答案 3 :(得分:-1)
如果您可以一次分配整个结构,则可以创建虚拟结构并使用赋值:
t_data const ONETWOTHREEFOURFIVE = { {1, 2, 3, 4, 5 } };
void init(t_data* data) {
*data = ONETWOTHREEFOURFIVE;