在c++中,将结构内部的数组归零

zero an array inside a struct in c++

本文关键字:内部 数组 归零 结构 c++      更新时间:2023-10-16

我在程序中定义了一个结构。

struct A{
    int arr[10];
}

比方说我有一个指向它的指针。A * a = new A;

我可以通过两种方式将其归零:

memset(&a->arr,0,sizeof(A));
memset(a->arr,0,sizeof(A));

工作和外表都一样!

哪一个更正确?

哪一个更正确?

我也不会争辩。最简单的方法是对分配的对象进行值初始化:

A * a = new A();

当然,这假设您实际上有充分的理由new这个对象。

由于您正在使用C++,我将利用C++11的功能并使用:

#include <iostream>
#include <cmath>
using namespace std;
struct A{
    int arr[10]{};  // initializes array with all 0's
};
int main() {
    A * a = new A;
    for (auto e : a->arr) // ranged based for loop to show all of the 0's
        cout << e << "n";
    return 0;
}

您可以看到它与此Live Example 一起运行

虽然每个表达式的类型不同,但实际结果,即传递给memset的指针,在这两种情况下都是相等的。

就我个人而言,我可能会在C++程序中使用std::fill而不是memset

std::fill(std::begin(a->arr), std::end(a->arr), 0);

还要注意,如果结构中有更多成员,则sizeof(A)将不同于sizeof(a->arr)(或sizeof(A::arr))。

您可以定义一个默认的构造函数

struct A{
    int arr[10];
    A():arr(){}
};

这是数组的正确方式

memset(a->arr,0,sizeof(a->arr))

挑选出arr成员,以防有其他不需要触摸的结构成员。在你的例子中没有区别,下面的也会这样做

memset(a->arr,0,sizeof(A));