memset传递数组或指针的第一个参数

时间:2010-08-13 04:32:05

标签: c memset

gcc 4.4.4 c89

指针与数组不同。但是数组可以衰减成指针。

我刚刚使用memset,第一个参数是指针。我想初始化我的结构数组。

struct devices
{
    char name[STRING_SIZE];
    size_t profile;
    char catagory;
};

struct devices dev[NUM_DEVICES];

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));

dev ==& dev [0]

但是我应该传递第一个参数吗:

 memset(&dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));

非常感谢任何建议,

1 个答案:

答案 0 :(得分:4)

你有什么:

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));

没问题 - 您将指针传递给数组的第一个元素以及数组的大小。但是,(size_t)强制转换是不必要的(sizeof类型为size_t,因此会导致正确的宣传),我发现dev[0]*dev更清晰在这种情况下:

memset(dev, 0, NUM_DEVICES * sizeof dev[0]);

或者,您可以使用&dev作为地址。在这种情况下,使用sizeof dev - 整个数组的大小:

可能更清楚
memset(&dev, 0, sizeof dev);

我说这更清楚,因为通常最好让第一个参数成为指向最后一个参数中sizeof主题的类型的指针:memset()应该看起来像这些形式:

memset(p, ..., N * sizeof p[0])
memset(&x, ..., sizeof x)

但请注意,最后一个仅在dev确实是数组时才有效 - 就像在这种情况下一样。如果你有一个指向数组第一个元素的指针,你需要使用第一个版本。