C++ 静态数组上的memset
当您必须设置静态数组的元素时,我对作为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有相同的影响 它们都包含相同的值,即
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);