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;
}
Run Code Online (Sandbox Code Playgroud)
当我调用memset时,我得到一个堆栈转储.这不是初始化结构数组的正确方法吗?
AnT*_*AnT 36
或
memset(&dev_sys, 0, sizeof dev_sys);
Run Code Online (Sandbox Code Playgroud)
要么
memset(dev_sys, 0, NUM_DEVICES * sizeof(struct device_sys));
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意
memset(dev_sys, 0, NUM_DEVICES * sizeof *dev_sys);
Run Code Online (Sandbox Code Playgroud)
但不是原始版本中的内容.
请注意,在所有变体的特定情况下,您可以使用&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)习语.
PS当然memset,在您的特定情况下,您应该使用初始化程序声明您的数组,而不是使用所有那些hackish技巧
struct device_sys dev_sys[NUM_DEVICES] = { 0 };
Run Code Online (Sandbox Code Playgroud)
没memset必要.
Han*_*ant 10
您的代码中存在拼写错误.固定:
memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
Run Code Online (Sandbox Code Playgroud)
挑选好名字可以避免一半的错误.我推荐"设备".