typedef struct {
double firstArray[3];
double secondArray[4][4];
bool thirdArray[2];
} myStruct;
我知道我们可以使用int myArray[10] = { 0 };
我有一个函数将myStruct中数组的所有元素初始化为零&假(对于布尔)。
void initializeElementsOfStruct(myStruct* str)
{
str->firstArray[0] = 0.0;
str->firstArray[1] = 0.0;
str->firstArray[2] = 0.0;
...
}
而不是上面或使用for循环,我如何在一个衬里中进行?
编辑:结构也可能包含非原始数据类型。
答案 0 :(得分:7)
由于struct只包含基本类型,因此可以将其整个内存表示设置为零,并且应该获得所需的效果。 (这可能会覆盖您在成员方法中不会写入的填充字节,但实际上最终可能更多有效。)
在C:
#include <string.h>
memset(str, 0, sizeof *str)
在C ++中:
#include <algorithm>
std::fill(reinterpret_cast<char*>(str),
reinterpret_cast<Char*>(str) + sizeof *str, 0);
答案 1 :(得分:3)
与C89 / 90向后兼容的惯用解决方案
void initializeElementsOfStruct(myStruct* str)
{
const myStruct ZERO = { 0 };
*str = ZERO;
}
对于其中的“愚蠢”编译器,将ZERO
声明为static
(在性能关键代码中)可能是有意义的。
在C99中你可以做到
void initializeElementsOfStruct(myStruct* str)
{
*str = (myStruct) { 0 };
}
一个相当等效的C ++版本(知道C ++特定的初始化语义)将看起来像
void initializeElementsOfStruct(myStruct* str)
{
*str = myStruct();
}
答案 2 :(得分:1)
在C ++ 11中,您可以定义一个这样的辅助函数:
#include <cstring>
#include <type_traits>
template<typename T,
typename = typename std::enable_if<std::is_pod<T>::value, T>::type>
void zero_initialize(T &x) {
std::memset(&x, 0, sizeof(x));
}
它仅适用于POD类型,否则无法编译。
void initializeElementsOfStruct(myStruct* str) {
zero_initialize(*str);
}