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

Posted

技术标签:

【中文标题】memset 中的第一个参数传递数组或指针【英文标题】:first parameter in memset passing array or pointer 【发布时间】:2010-08-13 04:32:04 【问题描述】:

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[0]

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

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

非常感谢您的建议,

【问题讨论】:

我知道这不完全是你的问题,但如果你这样做只是为了初始化你的 struct 数组,你真的应该使用类似下面的 struct devices dev[NUM_DEVICES] = 0 ; 甚至更好,如果你右侧有 C99 .name = "" 【参考方案1】:

你有什么:

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

【讨论】:

sizeof x 仅在静态分配数组时才返回数组元素的数量。我说的对吗? @DanSkeel:它与静态存储持续时间没有任何关系——sizeof a 将是数组 a 的大小,只要 a 实际上是一个数组(并且有完整类型;将sizeof 应用于不完整类型的内容是错误的)。请注意,指针不是 数组,将sizeof 应用于指针将得到指针的大小。另请注意,数组的大小不一定是元素的数量,它是元素的数量乘以每个元素的大小。 @caf:也许我用错了词...静态我的意思是在堆栈上分配。我很抱歉问可能很明显的事情,但我无法想出一种方法来定义数组变量(不是指针)而不设置它的大小。所以我的观点是你不能使用sizeof 来获取动态分配数组的大小。还是我错过了什么?如果我错了,你能举个例子吗? @DanSkeel:如何分配数组并不重要——重要的是sizeof 只会告诉你一个属于type 的大小。所以你可以有一个像int (*a)[100] = malloc(sizeof *a); 这样的动态分配数组,其中sizeof *a 正确返回数组*a 的大小。 好吧,你是对的,我们可以在堆上为预定义大小的数组分配内存。但是通过“动态”,我的意思是分配包含在变量中的大小数组。如果我们分配可变数量的内存,我们就不能定义一个 array 变量,对吧?我们将不得不使用指针,它将具有“不完整”类型,我们将无法与 sizeof 一起使用,并且只会获得指针的大小或单个元素的大小。 cmets 太多...如果您有时间,我很想在聊天中澄清它,谢谢。 chat.***.com/rooms/71457/clarification-of-sizeof-in-c

以上是关于memset 中的第一个参数传递数组或指针的主要内容,如果未能解决你的问题,请参考以下文章

数组名作函数参数时,实参与形参变量之间的数据传递是?

将数组作为 C++ 中方法的 const 参数传递

数组参数和指针参数

memset与初始化

使用变量与指向变量的指针作为函数的参数

二维数组指针作为函数参数传递