在 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
我的程序中定义了一个结构。
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