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

标签 c memset

海湾合作委员会 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));

开发 == &开发[0]

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

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

非常感谢任何建议,

最佳答案

你有什么:

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 确实是一个数组时才有效——就像在本例中一样。相反,如果您有指向数组第一个元素的指针,则需要使用第一个版本。

关于c - memset 中传递数组或指针的第一个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3473903/

相关文章:

c - 了解返回值函数 C

c - 在哪里可以找到有关此 .s 文件中的代码的文档?

从 C 子进程读取数据时 Python 挂起

cuda - 是否可以在 CUarray 上运行 cuMemset?

c - 用零填充 C-Array,然后将数据复制到其中

c++ - 如何打乱结构中的位?

c++ - 使用 memset 初始化整个数组

不能在幂函数中使用常数

c++ - 隐式转换将符号 'int"更改为 'unsigned int"

c - 我如何摆脱调用 __x86.get_pc_thunk.ax