Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C memset中传递数组或指针的第一个参数_C_Memset - Fatal编程技术网

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

C memset中传递数组或指针的第一个参数,c,memset,C,Memset,通用条款4.4.4 c89 指针与数组不同。但是数组可以分解成指针 我只是使用memset,第一个参数是指针。我想初始化我的结构数组 i、 e dev==&dev[0] 但是,如果我传递第一个参数,则有以下内容: memset(&dev, 0, (size_t)NUM_DEVICES * sizeof(*dev)); 非常感谢您的建议,您所拥有的: memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev)); 很好-传递指向数组第一个元素的

通用条款4.4.4 c89

指针与数组不同。但是数组可以分解成指针

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

i、 e

dev==&dev[0]

但是,如果我传递第一个参数,则有以下内容:

 memset(&dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));
非常感谢您的建议,

您所拥有的:

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));
很好-传递指向数组第一个元素的指针,以及数组的大小。但是,
(size\u t)
强制转换是不必要的(
sizeof
具有type
size\u 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
真的是一个数组时,最后一个才起作用,就像在本例中一样。如果有指向数组第一个元素的指针,则需要使用第一个版本。

您拥有的:

memset(dev, 0, (size_t)NUM_DEVICES * sizeof(*dev));
很好-传递指向数组第一个元素的指针,以及数组的大小。但是,
(size\u t)
强制转换是不必要的(
sizeof
具有type
size\u 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
真的是一个数组时,最后一个才起作用,就像在本例中一样。如果你有一个指向数组第一个元素的指针,你需要使用第一个版本。

我知道这不完全是你的问题,但是如果你只是为了初始化你的
struct
数组,你应该使用如下
struct devices dev[NUM\u devices]={{0}
甚至更好,如果你右手边有C99
{{.name=”“}
。我知道这不完全是你的问题,但是如果你只是这样做来初始化你的
struct
数组,你真的应该使用如下
struct devices dev[NUM_devices]={{0}
甚至更好,如果您在右侧有C99
{{.name=”“}
sizeof x
仅在静态分配数组时返回数组元素数。我说得对吗?@DanSkeel:这与静态存储持续时间无关-
sizeof a
将是数组
a
的大小,只要
a
实际上是一个数组(并且具有完整的类型;将
sizeof
应用于类型不完整的对象是错误的)。请注意,指针不是数组,将
sizeof
应用于指针将得到指针的大小。还要注意,数组的大小不一定是元素数,而是元素数乘以每个元素的大小。@caf:可能我用错了词。。。静态的意思是在堆栈上分配。我很抱歉要问一件很明显的事情,但我想不出一种方法来定义数组变量(不是指针),而不设置它的大小。所以我的观点是,不能使用
sizeof
来获取动态分配数组的大小。还是我错过了什么?如果我错了,你能举个例子吗?@DanSkeel:数组如何分配并不重要-重要的是
sizeof
只会告诉你一个属于类型的大小。因此您可以有一个动态分配的数组,如
int(*a)[100]=malloc(sizeof*a)
其中
sizeof*a
正确返回数组的大小
*a
。好的,你说得对,我们可以在堆上为预定义大小的数组分配内存。但“动态”的意思是分配包含在变量中的大小数组。如果我们分配可变的内存量,我们就不能定义一个数组变量,对吗?我们将不得不使用指针,它将具有“不完整”类型,我们将无法与
sizeof
一起使用,并且将只获得指针的大小或单个元素的大小。太多的评论。。。如果你有时间,我想在聊天中澄清一下,谢谢
sizeof x
仅在静态分配数组时返回数组元素数。我说得对吗?@DanSkeel:这与静态存储持续时间无关-
sizeof a
将是数组
a
的大小,只要
a
实际上是一个数组(并且具有完整的类型;将
sizeof
应用于类型不完整的对象是错误的)。请注意,指针不是数组,将
sizeof
应用于指针将得到指针的大小。还要注意,数组的大小不一定是元素数,而是元素数乘以每个元素的大小。@caf:可能我用错了词。。。静态的意思是在堆栈上分配。我很抱歉要问一件很明显的事情,但我想不出一种方法来定义数组变量(不是指针),而不设置它的大小。所以我的观点是,不能使用
sizeof
来获取动态分配数组的大小。还是我错过了什么?如果我错了,你能举个例子吗?@DanSkeel:数组的分配方式并不重要,重要的是