我的问题在代码中,但基本上我想知道如何/如果我可以做两个注释掉的行?我知道我可以在构造函数中完成它,但我不想!
struct foo
{
int b[4];
} boo;
//boo.b[] = {7, 6, 5, 4}; // <- why doesn't this work? (syntax error : ']')
//boo.b = {7, 6, 5, 4}; // <- or else this? (syntax error : '{')
boo.b[0] = 7; // <- doing it this way is annoying
boo.b[1] = 6; // :
boo.b[2] = 5; // :
boo.b[3] = 4; // <- doing it this way is annoying
boo.b[4] = 3; // <- why does this work!
(使用:C ++,Visual Studio 2005。)
答案 0 :(得分:8)
您只能在定义中使用初始化:
struct foo
{
int b[4];
};
foo boo = { 7, 6, 5, 4 };
关于最后一个问题:'为什么boo.b[4] = 3
有效?答案是它是未定义的行为,UB允许相当多的不同情况。编译器和运行时环境都不必诊断它,并且在许多情况下,结果将覆盖内存中的下一个元素。可以使用以下代码测试:
// Test
foo boo;
int x = 0;
boo.b[4] = 5;
std::cout << x << std::endl;
注意:这是未定义的行为,因此无论测试结果如何,都是不正确的,不能认为是可重复的测试。
答案 1 :(得分:2)
struct foo
{
int b[4];
} boo = {7,6,5,4};
答案 2 :(得分:1)
如果您确实需要在初始化之后写入该结构的成员,看起来您的值遵循一个简单的模式(以7开头并递减1),这意味着{{ 1}}或std::generate()
也可以完成这项工作:
std::generate_n()
答案 3 :(得分:1)
严格地说,在结构中初始化数组的语法是:
struct foo
{
int b[4];
};
foo boo = { { 7, 6, 5, 4 } };
但是,根据C标准的6.7.8.17,如果您不提供,编译器将隐式跟踪适当的范围。