我在C中有一个大数组(如果有所不同,则不是C++).我想将所有成员初始化为相同的值.我发誓我曾经知道一个简单的方法来做到这一点.我可以memset()
在我的情况下使用,但是没有办法在C语法中构建这样做吗?
如果我有这样的结构:
typedef struct
{
unsigned char c1;
unsigned char c2;
} myStruct;
Run Code Online (Sandbox Code Playgroud)
将此结构初始化为0的最简单方法是什么?以下是否足够?
myStruct _m1 = {0};
Run Code Online (Sandbox Code Playgroud)
或者我需要将每个成员显式初始化为0吗?
myStruct _m2 = {0,0};
Run Code Online (Sandbox Code Playgroud) 如果我只需要初始化C++结构的几个选择值,那么这是正确的:
struct foo {
foo() : a(true), b(true) {}
bool a;
bool b;
bool c;
} bar;
Run Code Online (Sandbox Code Playgroud)
我是正确的假设我最终会与一个struct
叫项bar
的元素bar.a = true
,bar.b = true
和一个未定义的bar.c
?
第一次尝试,一切正常:
class Base {
public:
Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {};
Run Code Online (Sandbox Code Playgroud)
另一种实现方式(添加explicit
):
class Base {
public:
explicit Base() {std::cout << "default ctor!\n"; }
};
...
Base b{};
Base b_one = {}; // error! Why?
Run Code Online (Sandbox Code Playgroud)
我已经读过cppreference,在这两种情况下都会使用默认初始化而不会出现diffences.
从列表初始化:
否则,如果braced-init-list为空且T是具有默认构造函数的类类型,则执行值初始化.
从值初始化:
如果T是没有默认构造函数的类类型,或者是用户提供或删除的默认构造函数,则该对象是默认初始化的;
在做了大量测试并写下这个答案之后(注意:在我完全重写它之前对它的反对票),我不明白为什么= {0}
不将结构的所有成员设置为零!
如果你这样做:
struct data_t
{
int num1 = 100;
int num2 = -100;
int num3;
int num4 = 150;
};
data_t d3 = {0};
printf("d3.num1 = %i\nd3.num2 = %i\nd3.num3 = %i\nd3.num4 = %i\n\n",
d3.num1, d3.num2, d3.num3, d3.num4);
Run Code Online (Sandbox Code Playgroud)
...输出是:
d3.num1 = 0
d3.num2 = -100
d3.num3 = 0
d3.num4 = 150
Run Code Online (Sandbox Code Playgroud)
...虽然我预计输出是这样的:
d3.num1 = 0
d3.num2 = 0
d3.num3 = 0
d3.num4 = 0
Run Code Online (Sandbox Code Playgroud)
...这意味着只有 FIRST 成员被设置为零,其余的都被设置为默认值。
我一直认为以这 3 种方式中的任何一种初始化结构都会将其初始化为零,但显然我错了!
data_t d{}
data_t d …