我的程序中定义了一个结构。
struct A{
int arr[10];
}
假设我有一个指向它的指针。
A * a = new A;
我可以用两种方式将其归零:
memset(&a->arr,0,sizeof(A));
memset(a->arr,0,sizeof(A));
工作和看起来都一样!
哪一个更正确?
答案 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));