Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过结构指针将结构的成员初始化为零_C++_C_Arrays_Struct - Fatal编程技术网

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

C++ 通过结构指针将结构的成员初始化为零,c++,c,arrays,struct,C++,C,Arrays,Struct,我知道我们可以使用intmyarray[10]={0}在一行中将数组的所有值初始化为零 我有一个函数将myStruct中数组的所有元素初始化为零&false(对于bool) 如何在一行程序中完成上述操作,而不是使用for循环 编辑:结构也可能包含非基本数据类型。由于结构只包含基本类型,因此可以将其整个内存表示形式设置为零,并应获得所需的效果。(这可能会覆盖填充字节,在您的成员方式中您不会写入这些字节,但最终可能会更有效。) 在C中: #包括 memset(str,0,sizeof*str) 在

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

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

如何在一行程序中完成上述操作,而不是使用for循环


编辑:结构也可能包含非基本数据类型。

由于结构只包含基本类型,因此可以将其整个内存表示形式设置为零,并应获得所需的效果。(这可能会覆盖填充字节,在您的成员方式中您不会写入这些字节,但最终可能会更有效。)

在C中:

#包括
memset(str,0,sizeof*str)
在C++中:

#include <string.h>

memset(str, 0, sizeof *str)
#包括
标准:填充(重新解释铸件(str),
重新解释铸件(str)+尺寸*str,0);

与C89/90向后兼容的惯用解决方案是

#include <algorithm>

std::fill(reinterpret_cast<char*>(str),
          reinterpret_cast<Char*>(str) + sizeof *str, 0);
对于“愚蠢”的编译器来说,将
ZERO
声明为
static
(在性能关键代码中)可能是有意义的

在C99中,您可以简单地执行以下操作

void initializeElementsOfStruct(myStruct* str)
{
  const myStruct ZERO = { 0 };
  *str = ZERO;
}

一个相当等价的C++版本(它是C++特定的初始化语义),看起来是

void initializeElementsOfStruct(myStruct* str)
{
  *str = (myStruct) { 0 };
}

在C++11中,您可以定义以下帮助器函数:

void initializeElementsOfStruct(myStruct* str)
{
  *str = myStruct();
}

对不起,我应该提到结构也可能有非基本类型。我现在在问题中添加了这一行。
memory.h
?也许你的意思是
string.h
@user694733:你说得对。我原以为
memory.h
是标准的,但它似乎只是GCC的东西。@Kerrek SB如果数组是枚举类型,memset还会工作吗?@ontherocks:应该,因为枚举是整数类型。我想不出零值不由零字节模式表示的情况。啊,你改变了问题和语言。这有点令人沮丧,但你能至少创建一个具有代表性的示例(即,一个示例问题,其解决方案也能解决你的实际问题)吗?主持人改变了语言,这并不酷。请随意把它换回来!使用calloc()在运行时分配内存如何?
void initializeElementsOfStruct(myStruct* str)
{
  *str = (myStruct) { 0 };
}
void initializeElementsOfStruct(myStruct* str)
{
  *str = myStruct();
}
#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));
}
void initializeElementsOfStruct(myStruct* str) {
  zero_initialize(*str);
}