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时,我得到一个堆栈转储。这不是初始化结构数组的正确方法吗?
答案 0 :(得分:32)
无论
memset(&dev_sys, 0, sizeof dev_sys);
或
memset(dev_sys, 0, NUM_DEVICES * sizeof(struct device_sys));
或者,如果您愿意
memset(dev_sys, 0, NUM_DEVICES * sizeof *dev_sys);
但不是原始版本中的内容。
请注意,在所有变体的特定情况下,您可以使用&dev_sys
或dev_sys
作为第一个参数。效果是一样的。但是,&dev_sys
在第一个版本中更合适,因为如果遵循memset(ptr-to-object, object-size)
惯用法。在第二个和第三个变体中,使用dev_sys
(或&dev_sys[0]
)更合适,因为它遵循memset(ptr-to-first-element, number-of-elements * element-size)
惯用法。
P.S。当然,在您的特定情况下,您应该使用初始化程序声明您的数组,而不是使用所有那些hackish memset
技巧
struct device_sys dev_sys[NUM_DEVICES] = { 0 };
不需要memset
。
答案 1 :(得分:9)
您的代码中存在拼写错误。修正:
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
挑选好名字可以避免一半的错误。我推荐“设备”。
答案 2 :(得分:1)
您必须传递sizeof
运算符的类型而不是变量。
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
我更喜欢使用typedef
作为结构。
typedef struct tag_device_sys
{
char device[STRING_SIZE];
int id;
char category;
} device_sys;
您可以使用memset
,如下所示:
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(device_sys));
答案 3 :(得分:1)
对于数组,sizeof
可以获得数组的整个大小,而不是单个元素的大小。 sizeof
运算符是少数几个不将数组视为指向其第一个元素的指针的地方之一。