在函数中定义struct数组

时间:2012-09-11 13:30:08

标签: c++ visual-c++

代码:

int i;
struct st
{
    int m;
}st_t[2];

void foo()
{
    i = 4;
    st_t[2] = 
    {
       {10},{20}
    };  // it's wrong !!!!  but I don't know how to do.     
}
int main()
{
   foo();
   cout<<i<<endl;          // will output 4;
   cout<<st_t[0].m<<endl;  // this should output 10
   cout<<st_t[1].m<<endl;  // this should output 20

   return 0;
}

是否可以在函数中定义结构数组?如果是,那该怎么办? 提前致谢。

PS:
对不起,我的英语不好。我正在制作一个俄罗斯方块游戏,它有一个Shape类,我在Shape.h中声明了一个形状结构数组,然后我在Shape.cpp中的Shape构造函数中分配给struct数组。这样对吗?或者如何分配给struct数组,以便我可以在另一个函数中使用它?

4 个答案:

答案 0 :(得分:2)

您可以在定义的位置初始化数组。即要么将定义移动到函数中,要么将初始化移出函数:

struct st 
{ 
    int m; 
} 
st_t[2] = {{10},{20}};

答案 1 :(得分:0)

如果要在函数中定义数组(如问题标题和文本所示),则将类型说明符st添加到定义中:

st st_t[2] = 
{
   {10},{20}
};

但是,这将是一个单独的数组到全局的数组,因此main()的输出将与您的评论所说的不匹配。如果您确实想要分配给全局数组,那么:

st_t[0].m = 10;
st_t[1].m = 20;

或者,在C ++ 11中,如果用std::array替换plain数组,则可以使用与示例类似的语法:

std::array<st, 2> st_t;

void foo() {
    // Note the extra braces - std::array is an aggregate containing an array
    st_t = 
    {{
        {10},{20}
    }};
}

答案 2 :(得分:0)

如果你只想要函数范围的变量那么

void foo() {
    struct {
        int m;
    } st_t = { {10}, {20} };
    // do something
}

答案 3 :(得分:0)

您可以初始化临时变量并将此变量复制到全局变量,而不是直接赋值:

删除:

 ...
 st_t[2] =  {
      {10},{20}
 };
 ...

并添加:

 ...
 st tmp[2] = { {10}, {20} };  

 memcpy(st_t, tmp, sizeof st_t);
 ...

<强>附录:

如果它不适合您,则代码中可能会出现其他错误。从你的例子:

#include <iostream>
#include <memory.h>
using namespace std;

 int i;
 struct st { int m; } st_t[2];

 void foo()
{
 i = 4;
 st tmp[2] = { {10}, {20} }; 
 memcpy(st_t, tmp, sizeof st_t); // use: const_addr instead of &const_addr
}

 int main()
{
 foo();
 cout << i << endl;          // will output 4;
 cout << st_t[0].m << endl;  // this should output 10
 cout << st_t[1].m << endl;  // this should output 20
 return 0;
}

所有工作都按预期正常。