23

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 时,我得到一个堆栈转储。这不是初始化结构数组的正确方法吗?

4

4 回答 4

46

任何一个

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_sysdev_sys作为第一个参数。效果将是相同的。但是,&dev_sys在第一个变体中更合适,因为 if 遵循memset(ptr-to-object, object-size)成语。dev_sys在第二个和第三个变体中,使用(or )更合适&dev_sys[0],因为它遵循memset(ptr-to-first-element, number-of-elements * element-size)成语。

PS当然,不要使用所有那些骇人听闻的memset技巧,在您的特定情况下,您应该刚刚使用初始化程序声明您的数组

struct device_sys dev_sys[NUM_DEVICES] = { 0 };

没有memset必要。

于 2010-08-02T16:12:56.987 回答
11

你的代码有错别字。使固定:

memset(dev_sys, 0, (size_t)NUM_DEVICES * sizeof(struct device_sys));

选择好名字可以避免一半的错误。我会推荐“设备”。

于 2010-08-02T16:03:07.847 回答
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));
于 2010-08-02T16:12:54.680 回答
1

对于数组,sizeof获取数组的整个大小,而不是单个元素的大小。sizeof运算符是少数几个不将数组视为指向其第一个元素的指针的地方之一。

于 2010-08-02T17:11:33.087 回答