簡體   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