使用memset初始化结构数组

ant*_*009 17 c 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; 
}
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_sysdev_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必要.

  • @robUK:`dev_sys`不是指针,'dev_sys`是一个数组.虽然它可能"假装"在某些上下文中成为指针,但它实际上并不是指针.`&dev_sys`为你提供了一个指向整个数组的指针,它在数字上与指向它的第一个元素的指针相同(这反过来又是你可以使用相同效果的原因).如果你将它声明为`struct device*dev_sys`(一个指针),`&dev_sys`将不起作用.但是当它被声明为一个实际数组时(如在你的OP中),`&dev_sys`将起作用. (2认同)

Han*_*ant 10

您的代码中存在拼写错误.固定:

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));
Run Code Online (Sandbox Code Playgroud)

挑选好名字可以避免一半的错误.我推荐"设备".

  • 可能更安全的方式:`memset(dev_sys,0,sizeof(dev_sys));` (3认同)