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

时间:2015-06-29 15:18:23

标签: c++ struct memset

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

struct A{
    int arr[10];
}

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

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

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

工作和看起来都一样!

哪一个更正确?

5 个答案:

答案 0 :(得分:2)

  

哪一个更正确?

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

A * a = new A();

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

答案 1 :(得分:2)

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

一起运行

答案 2 :(得分:1)

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

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

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

另请注意,如果结构中有更多成员,sizeof(A)将与sizeof(a->arr)(或sizeof(A::arr))不同。

答案 3 :(得分:1)

您可以定义默认构造函数

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

答案 4 :(得分:0)

这是只有数组的正确方法

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

选择arr成员以防万一其他结构成员不需要触摸。在您的示例中没有任何区别,以下也会这样做

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