Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++_Arrays_Memset - Fatal编程技术网

C++ 静态数组上的memset

C++ 静态数组上的memset,c++,arrays,memset,C++,Arrays,Memset,当您必须设置静态数组的元素时,我对作为memset的第一个参数传递什么有点困惑。我一直在搜索,但我找不到一些具体问题的答案 如果我将数组声明为: char arr[10]; 我已经看到这两个调用是有效的,并产生相同的效果: memset( arr, 0, 10); memset( &arr, 0, 10); 我的具体问题是: 1-为什么它们对arr有相同的影响 2-这些电话之间有什么不同 3-哪一个被认为是正确的 谢谢大家! 1-为什么它们对arr有相同的影响 它们都包含相同的值,即

当您必须设置静态数组的元素时,我对作为memset的第一个参数传递什么有点困惑。我一直在搜索,但我找不到一些具体问题的答案

如果我将数组声明为:

char arr[10];
我已经看到这两个调用是有效的,并产生相同的效果:

memset( arr, 0, 10);
memset( &arr, 0, 10);
我的具体问题是:

1-为什么它们对arr有相同的影响

2-这些电话之间有什么不同

3-哪一个被认为是正确的

谢谢大家!

1-为什么它们对arr有相同的影响

它们都包含相同的值,即数组开头的地址

2-这些电话之间有什么不同

arr
衰减为指向char的指针,即
char*
(将数组名称传递给函数时发生此转换),而
&arr
是指向char的数组的指针,即
char(*)[]

3-哪一个被认为是正确的

我会使用
arr
memset
接受一个
void*
,这是两者都工作的原因


另外,请注意
char-arr[10]={}
可用于对数组进行零初始化。

存储持续时间与此无关;数组就是数组。这句话:

&arr
生成一个
char(*)[10]
,即指向包含10个元素的
char
数组的指针。但是,当
arr
被传递给这样的函数时:

memset(arr, 0, 10);
它降级为指向第一个元素的指针,即
char*
。这不是一回事。“正确”(惯用)的说法是:

但是,在这种情况下,当传递到
memset
时,它们都转换为
void*
,并在函数中解释为
无符号字符*
。因为它们都指向同一个地方,所以产生相同的结果

然而,重要的是要认识到,当处理真正的各自类型(即,不是
void*
)时,指向数组的指针与指向数组第一个元素的指针不同

例如,增加
char(*)[10]
将增加指针
sizeof(char[10])
字节,而增加
char*
将只增加一个字节

为什么它们对arr有相同的影响?这些电话有什么不同

因为数组的地址与其第一个元素的地址相同(数组在传递给函数时会衰减为指向其第一个元素的指针),所以它们的类型不同
arr
具有类型
char[10]
,当传递给函数时,该类型会衰减为
char*
。相反,
&arr
的类型为
char(*)[10]
,作为函数参数传递时不会改变

哪一个被认为是正确的


只要函数不需要特定的类型,i。E它接受
void*
,任何一个都是好的。但是,如果被调用函数希望指定其中一种类型,则不应使用另一种类型,因为这样您的程序将出现错误并调用未定义的行为。

将它们全部设置为零的正确方法:
char arr[10]={}小心-
arr
不是指向字符的指针,但它可以衰减为一个字符。@DrewDormann:谢谢,当你快速键入(更改的措辞)时,很难精确。使用
memset(arr,0,10)不是更好吗?如果由于某种原因将数组的声明更改为
char*arr=new char[10]
,则它仍然有效。@user502144我们不是在讨论“when It changes”的情况。或者,更准确地说,我在上一部分中提到了这两个字符何时有效。一个更正:
并在函数中解释为char*
应更改为
unsigned char*
memset(arr, 0, 10);