结构内的数组

时间:2014-02-11 13:19:36

标签: c++ arrays struct

我想创建一个结构,其中包含固定大小的数组:

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 '}'

任何帮助将不胜感激。我试图找到类似的问题,但到目前为止还没有找到任何帮助。

4 个答案:

答案 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,

就会有效。