在 C++ 中将结构内的数组归零

zero an array inside a struct in c++

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

struct A{
    int arr[10];
}

假设我有指向它的指针。 A * a = new A;

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

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

工作和外观都一样!

哪个更正确?

which one is more correct?

我都不反对。最简单的方法是对分配的对象进行值初始化:

A * a = new A();

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

虽然每个表达式的类型不同,但实际结果,即您传递给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));

由于您使用的是 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