为什么memset不能在c++11中使用数组容器

Why memset is not working with array container in c++11?

本文关键字:数组 memset 不能 c++11 为什么      更新时间:2023-10-16
#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);