繁体   English   中英

通过结构指针将结构的成员初始化为零

[英]Initialize members of a struct to zero via the struct pointer

typedef struct {  
double firstArray[3];
double secondArray[4][4];
bool   thirdArray[2];    
} myStruct;

我知道我们可以使用int myArray[10] = { 0 };在一行中将数​​组的所有值初始化为零int myArray[10] = { 0 };

我有一个函数可以将myStruct中数组的所有元素初始化为零和false(对于布尔)。

void initializeElementsOfStruct(myStruct* str)
{
str->firstArray[0] = 0.0;
str->firstArray[1] = 0.0;
str->firstArray[2] = 0.0;
...
}

代替上面的方法或使用for循环,如何在一个衬里中做?

编辑:该结构也可能包含非原始数据类型。

由于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);

与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();
}

在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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM