结构体内的数组

4

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

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

任何帮助都将不胜感激。我已经尝试寻找类似的问题,但到目前为止没有找到有用的信息。

1
数组不可分配。 如果您需要更好的工作数组,请使用 std :: array - chris
4个回答

5

如果不在初始化中,你不能这样做。你应该这样做:

name.array1[0] = 1;
name.array1[1] = 2;
name.array1[2] = 3;

请参考这篇有用的答案

不仅仅是数组,你不能在定义以外的任何地方提供初始化程序。有时人们会将诸如int i; i = 0;的第二个语句称为“初始化i”。实际上,它是对i进行赋值,因为它以前持有一个未确定的值,因为它没有被初始化。称其为“初始化”很少引起困惑,但就语言而言,这里没有初始化程序。


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

mystruct声明中,struct关键字是无用的。而且既然这个问题标记为C++,为什么要谈论C99呢? - Davidbrcz

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的默认赋值运算符。

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标准,才能保证有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接