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