使用 memset 初始化结构体数组
gcc 4.4.4 c89
我有以下结构。
struct device_sys
{
char device[STRING_SIZE];
int id;
char category;
};
int main(void)
{
struct device_sys dev_sys[NUM_DEVICES];
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(dev_sys));
return 0;
}
当我调用 memset 时,我得到了堆栈转储。这不是初始化结构体数组的正确方法吗?
gcc 4.4.4 c89
I have the following structure.
struct device_sys
{
char device[STRING_SIZE];
int id;
char category;
};
int main(void)
{
struct device_sys dev_sys[NUM_DEVICES];
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(dev_sys));
return 0;
}
I get a stack dump when I call memset. Is this not the correct way to initialize an structure array?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
要么
要么
或者,如果您喜欢
但不喜欢原始变体中的内容。
请注意,在您的特定情况下,在所有变体中,您可以使用
&dev_sys
或dev_sys
作为第一个参数。效果是一样的。但是,&dev_sys
在第一个变体中更合适,因为 if 遵循memset(ptr-to-object, object-size)
习惯用法。在第二个和第三个变体中,使用dev_sys
(或&dev_sys[0]
)更合适,因为它遵循memset(ptr-to-第一个元素,元素数量 * 元素大小)
习惯用法。PS 当然,在您的特定情况下,您应该使用初始化器声明您的数组,而不是使用所有那些黑客
memset
技巧。必要的。
Either
or
Or, if you prefer
but not what you have in your original variant.
Note, that in your specific case in all variants you can use either
&dev_sys
ordev_sys
as the first argument. The effect will be the same. However,&dev_sys
is more appropriate in the first variant, since if follows thememset(ptr-to-object, object-size)
idiom. In the second and third variants it is more appropriate to usedev_sys
(or&dev_sys[0]
), since it follows thememset(ptr-to-first-element, number-of-elements * element-size)
idiom.P.S. Of course, instead of using all that hackish
memset
trickery, in your particular case you should have just declared your array with an initializerNo
memset
necessary.您的代码中有一个拼写错误。修复:
选择好名字可以避免一半的错误。我推荐“设备”。
There's a typo in your code. Fix:
Picking good names avoid half the bugs. I'd recommend "devices".
对于数组,
sizeof
获取数组的整个大小,而不是单个元素的大小。sizeof
运算符是少数几个不将数组视为指向其第一个元素的指针的地方之一。For an array,
sizeof
gets you the entire size of the array, not the size of an individual element. Thesizeof
operator is one of the few places where an array is not treated as a pointer to its first element.您必须向
sizeof
运算符传递类型而不是变量。我更喜欢使用
typedef
作为结构。您可以使用
memset
,如下所示:You have to pass the
sizeof
operator the type and not the variable.I prefer to use
typedef
for the struct.The you can use
memset
as follows: