多维数组作为结构成员的内存分配C

时间:2016-11-17 15:33:00

标签: c arrays pointers multidimensional-array

我大约10天前开始学习C并决定写一个战舰游戏。 我有一个结构播放器,它有一个2d整数数组作为成员。

   struct player{
   ...
   int field[X][Y];...};
在我的情况下,

X和Y都是5。

当我在main中创建一个新玩家并调用 print_field(int field [X] [Y])方法时(它只打印 field 的所有成员)< / p>

int main(){
   struct player player1;
   print_field(player1.field);}

我只是得到一些随机的东西,比如
00000 18356276361600061541186983333419528026550 00010 41963970000 04196320041956320

我尝试了不同的malloc和calloc方式,如

player1.field = malloc(sizeof(player1.field));

但是我得到了不同类型的指针,数组或强制转换异常。

请解释我是如何运作的。

3 个答案:

答案 0 :(得分:1)

当您定义本地(非静态)变量或通过malloc分配内存时,内存不会以任何方式初始化。它的内容是不确定并且看起来是随机的(实际上它将是当时在内存中发生的任何事情)。

以任何方式使用该内存,除了初始化它之外,都会导致未定义的行为

您可以在定义变量时初始化整个结构:

struct player player1 = { ..., { { 0 } } };

另请注意

player1.field = malloc(sizeof(player1.field));

错误。编译器应该抱怨它。您无法分配给数组。而且你也不需要为它分配内存。编译器将确保在定义player1变量时分配整个结构的内存。

答案 1 :(得分:1)

您将玩家1定义为local variable,因此初始值是不确定的。

您可以使用compound literals“简单地”初始化您的结构:

#include <stdio.h>

#define X 5
#define Y 5

struct player{
       int field[X][Y];
};

int main( void )
{
   struct player player1 = (struct player){.field={{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14},{15,16,17,18,19},{20,21,22,23,24}}};

   for (size_t i=0; i<X; i++)
   {
       for(size_t j=0; j<Y; j++)
       {
           printf ("%d\n", player1.field[i][j]);

       }
   }
}

答案 2 :(得分:-3)

问题是如何分配字段。 如果你想要一个固定的尺寸,你可以简单地调用你的字段

int field[5][5];

否则,您需要以这种方式分配:

int i = 0;
player1.field = malloc(sizeof(player1.field) * size);
while (i++ < size)
    player1.field[i] = malloc(sizeof(player1.field) * size);