为什么memset不能在c++11中使用数组容器
Why memset is not working with array container in c++11?
#include <iostream>
#include <array>
#include <cstring>
using namespace std;
int main ()
{
array<int,5> A ;
memset(A,0,sizeof A);
for(int i=0;i < 5;i++){
cout<<A[i]<<" ";
}
return 0;
}
当我运行程序时,出现了编译错误。
但是当我使用int A[5]
而不是array<int,5> A
时,memset工作得很好。为什么memset不能使用容器数组,因为这两种方法都用于定义固定大小的数组?
密切关注memset
:的声明
void * memset ( void * ptr, int value, size_t num );
请注意,第一个参数必须是指针。
原始数组是c++中的特殊元素。不能将它们作为参数传递给函数,但如果函数将指针作为参数,则适当类型的数组将衰减为指向第一个元素的指针。这就是为什么可以将原始数组传递给需要指针的函数。
std::array
不是一个原始数组,而是一个正则类。类实例不会衰减为指针。这就是为什么不能将std::array
的实例作为memset
的参数传递。
正如注释中已经解释的那样,无论如何都不应该使用memset
来初始化std::array
。
std::memset
应该可以与std::array
配合使用。如果您查看std::memset
的声明,您会发现它使用了一个指向数组的指针,这就是代码不起作用的原因。
void* memset( void* dest, int ch, std::size_t count );
这应该有效:
memset(A.data(), 0, A.size() * sizeof(A[0]);
正如其他人所指出的,在您的示例中,最好初始化阵列
array<int, 5> A = {};
memset(A,0,sizeof A);
不正确。这是一种反模式。将对象设置为所有零位的方法(对于允许此操作的对象(是:
memset(&obj, 0, sizeof obj);
或者如果我们有一个指向对象的指针:
memset(ptr, 0, sizeof *ptr);
您的窗体恰好对C样式数组"有效",因为A
会衰减到指针,但sizeof A
不会衰减。但对于非数组,您将得到大小不匹配(或完全错误(。坚持使用两种规范形式中的一种可以避免大小不匹配。
std::array
不需要实现为C样式数组,因此在其上使用memset
是不合适的。如果你正在创建阵列,你可以简单地写:
array<int,5> A = {};
如果以后需要重置阵列,则可以使用:
A.fill(0);
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 使用 memset 填充数组会显示垃圾
- 使用memset初始化int数组
- 使用memset初始化后,访问违反写作错误写入2D数组
- 可以使用 memset 来填充 std::complex<float>s 数组吗?
- 在双精度类型数组中使用 memset()
- memset 将 -1 放入我的数组中,而不是我指定的值,这是怎么回事
- 清除一个字符数组的最佳方案-是否为memset
- 使用memset将字符串数组设置为0后,该数组不可用
- 在C++中使用具有多维数组的memset
- c++中使用memset初始化具有不同值的struct数组元素
- 通过memset函数设置2D int数组元素为1
- 在c++中正确使用memset和memcpy初始化字符数组
- 为什么memset在2d数组中正确填充0,但在该数组中无法填充1 ?
- 如何使用memset初始化动态二维数组
- memset如何以-1初始化整数数组
- 静态数组上的Memset
- 为什么memset不能在c++11中使用数组容器