我想创建一个结构,其中包含固定大小的数组:
struct smt{
int array1[3];
int array2[10];
int bananas;
};
这样我就可以在主代码中使用它了。但是,当我尝试填充数组时,我总是会收到错误:
int main(){
smt name;
name.array1 = {1,2,3};
return 0;
}
错误在name.array1 = {...};行:
error C2059: syntax error : '{'
error C2143: syntax error : missing ';' before '{'
error C2143: syntax error : missing ';' before '}'
任何帮助将不胜感激。我试图找到类似的问题,但到目前为止还没有找到任何帮助。
答案 0 :(得分:5)
如果它不在初始化中,则不能这样做。你应该这样做:
name.array1[0] = 1;
name.array1[1] = 2;
name.array1[2] = 3;
请参阅此有用的answer:
这不仅仅是数组,你不能为任何东西提供初始化器 除了定义之外的任何地方。人们有时会提到 像int i这样的第二个陈述; i = 0;作为“初始化我”。 实际上它正在分配给i,之前它拥有不确定性 值,因为它没有初始化。它很少令人困惑 称之为“初始化”,但就语言而言 那里没有初始化器。
答案 1 :(得分:4)
{...}语法只能在初始化期间使用。
您需要一次初始化结构以使用此语法。
例如:
struct smt {
int array1[3];
int array2[10];
int bananas;
};
struct smt mystruct = {
{ 1, 2, 3 },
{ 1, 2 ,3 ,4 5, 6, 7, 8, 9, 10 },
0
};
另请注意,在C99(但不是C ++)中,您可以使用这样的指定初始值设定项来提高可读性:
struct smt mystruct = {
.array1 = { 1, 2, 3 },
.array2 = { 1, 2 ,3 ,4 5, 6, 7, 8, 9, 10 },
.bananas = 0
};
答案 2 :(得分:1)
使用C ++ 11统一初始化列表,你可以这样做(它也适用于C ++ 03,因为smt是POD)。
#include <iostream>
using namespace std;
struct smt{
int array1[3];
int array2[10];
int bananas;
};
int main() {
//I use {} to do a value-initialization (to zero) of array2
smt s={{0,1,2},{},5};
std::cout<<s.array1[0]<<std::endl;
return 0;
}
此外,使用std::array
可以实现:
std::array<int,4> a;
a={1,2,3,4};
因为编译器生成了std::array
的默认赋值运算符。
答案 3 :(得分:0)
本声明
name.array1 = {1,2,3};
在定义对象期间不是初始化。这是一份任务说明。但是数组没有赋值运算符。
您可以在创建结构对象期间初始化数组。例如
smt name = { { 1, 2, 3 } };
或者,如果您确实需要为数组的元素分配1,2,3,则可以使用标准算法std :: iota。例如
std::iota( std::begin( name.array1 ), std::end( name.array1 ), 1 );
或者你可以分别分配数组的每个元素,例如
name.array1[0] = 1;
要使用您最初想要的语法,您应该将数组定义替换为std :: array。例如
#include <array>
struct smt{
std::array<int, 3> array1;
std::array<int, 10> array2;
int bananas;
};
在这种情况下,例如
int main(){
smt name;
name.array1 = {1,2,3};
return 0;
}
只要您的编译器支持C ++ 2011 Standard,就会有效。