如何初始化结构中的数组而不单独执行每个元素? (C ++)

时间:2010-05-14 15:31:03

标签: c++ arrays struct

我的问题在代码中,但基本上我想知道如何/如果我可以做两个注释掉的行?我知道我可以在构造函数中完成它,但我不想!

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。)

4 个答案:

答案 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,如果您不提供,编译器将隐式跟踪适当的范围。