在C中初始化结构内部的常量数组?
在C中初始化结构内部常量数组的最佳方法是什么在C中初始化结构内部的常量数组?,c,arrays,C,Arrays,在C中初始化结构内部常量数组的最佳方法是什么 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];
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种元素
有更好的方法吗?您的意思是初始化结构内部的非常量数组,对吗
我想你想要这个:
memcpy(data->coefs, ONETWOTHREEFOURFIVE, sizeof(ONETWOTHREEFOURFIVE));
你的意思是初始化结构内部的非常量数组,对吗
我想你想要这个:
memcpy(data->coefs, ONETWOTHREEFOURFIVE, sizeof(ONETWOTHREEFOURFIVE));
如果可以一次分配整个结构,则可以创建虚拟结构并使用分配:
t_data const ONETWOTHREEFOURFIVE = { {1, 2, 3, 4, 5 } };
void init(t_data* data) {
*data = ONETWOTHREEFOURFIVE;
如果可以一次分配整个结构,则可以创建虚拟结构并使用分配:
t_data const ONETWOTHREEFOURFIVE = { {1, 2, 3, 4, 5 } };
void init(t_data* data) {
*data = ONETWOTHREEFOURFIVE;
假设您确定大小相同,可以使用
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));
}
您将注意到,我在其中还有一个
断言
,这将允许您尽早检测您是否正在构建超越两个数组大小相同假设的代码。这将避免读写时的缓冲区溢出。如果您确定大小相同,可以使用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));
}
您将注意到,我在其中还有一个
断言
,这将允许您尽早检测您是否正在构建超越两个数组大小相同假设的代码。这将避免读写时的缓冲区溢出。我的两分钱。假设您的t_数据
可能包含比系数数组更多的内容,您可以使用专用的holder结构,避免任何循环或memcpy()
另请注意,这一行:
data->coefs = init_set;
不是初始化,而是赋值。当然,在某些体系结构上,此任务可能会转换为调用
memcpy()
,但无论如何,源代码看起来更清晰。我的两分钱。假设您的t_数据
可能包含比系数数组更多的内容,您可以使用专用的holder结构,避免任何循环或memcpy()
另请注意,这一行:
data->coefs = init_set;
不是初始化,而是赋值。当然,在某些体系结构上,这个赋值可以转换为调用
memcpy()
,但不管怎样,源代码看起来更清晰。使用for
循环,或者memcpy
“…在C中初始化结构中的常量数组”-正在初始化的目标数组不是常量;源是。使用for
循环,或memcpy
“…在C中的结构中初始化常量数组”-正在初始化的目标数组不是常量;源代码是。感谢范围感知。您甚至可以将该断言设置为编译时断言:int comp_assert[sizeof(data->coefs)==sizeof(srcData)?1:-1]代码> @ SelBeEE + 1编译时断言,但如果标准可用,我将使用“代码> STATICAsAsHyt< /Cube >。我认为<代码> StistaSytRe< <代码>仅为C++。它也存在于C语言中吗?@selbie在C11中,他们添加了\u Static\u assert
。感谢范围感知。您甚至可以将该assert设置为编译时assert:int comp\u assert[sizeof(data->coefs)==sizeof(srcData)?1:-1]代码> @ SelBeEE + 1编译时断言,但如果标准可用,我将使用“代码> STATICAsAsHyt< /Cube >。我认为<代码> StistaSytRe< <代码>仅为C++。它是否也存在于C中?@selbie在C11中,他们添加了\u Static\u assert
。