c++ - 静态数组上的 memset

标签 c++ arrays memset

当您必须设置静态数组的元素时,我对将什么作为第一个参数传递给 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/

相关文章:

c++ - 在Boost program_options中的配置文件中处理无值选项

javascript - 未捕获的类型错误 : UnitType is not a constructor

c - 使用 memset 设置数组

二维数组 `memset` 上的困惑和 `free` 上的错误

c - 是否有用于 16 位和/或 32 位值的 memset() 函数?

c++ - C++ 中的移动赋值问题。非法指令 : 4

c++ - 在 C++ 中支持基于模式的不断发展的 XML 的技术

c# - 结构 - 初始化和写入文件

javascript - 计算不包括节假日和周末的 future 日期

php - 如何在 PHP 数组中定义自定义键?