当您必须设置静态数组的元素时,我对将什么作为第一个参数传递给 memset 感到有点困惑。我一直在搜索,但我找不到某些特定问题的答案。
如果我有一个数组声明为:
char arr[10];
我已经看到这两个调用是有效的并且产生相同的效果:
memset( arr, 0, 10);
memset( &arr, 0, 10);
我的具体问题是:
1- 为什么它们对 arr 有同样的效果?
2- 这些调用有什么不同?
3- 哪一个被认为是正确的?
谢谢!
最佳答案
存储时长与它无关;数组就是数组。这个表达式:
&arr
产生一个 char (*)[10]
,即指向包含 10 个元素的 char
数组的指针。但是,当 arr
被传递给这样的函数时:
memset(arr, 0, 10);
它退化为指向第一个元素的指针,即 char*
。这些不是一回事。 “正确的”(惯用的)调用是:
memset(arr, 0, 10);
但是,在这种情况下,当它们传递给 memset
并在函数中解释为 unsigned char*
时,它们都被转换为 void*
>。因为它们都指向同一个地方,所以产生相同的结果。
但是,重要的是要认识到,在处理各自的真实类型(即不是 void*
)时,指向数组的指针不是与指向数组第一个元素的指针相同。
例如,增加一个char (*)[10]
会增加指针sizeof(char[10])
字节,而增加一个char*
只会增加一个字节。
关于c++ - 静态数组上的 memset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15465874/