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

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

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

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

代替上述或使用 for 循环,我该如何在一个衬垫中做到这一点?

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

4

3 回答 3

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);
于 2013-09-19T12:48:55.383 回答
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();
}
于 2013-09-30T15:38:44.390 回答
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);
}
于 2013-09-30T17:41:14.317 回答