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 中的第一个参数传递数组或指针的主要内容,如果未能解决你的问题,请参考以下文章