2016-11-17 65 views
-2

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

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

在我的情况下,X和Y都是5。

当我创建的主要新球员,并调用print_field(INT场[X] [Y])方法(简单地打印的所有成员)

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

我只是得到像
00000 18356276361600061541186983333419528026550 00010 41963970000 04196320041956320

一些随机的东西,我试着malloc和释放calloc的不同明显的方式像

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

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

请解释我是如何工作的。

+2

请显示[MCVE。你没有提供足够的信息。我们所能说的只是:您没有显示的代码中存在一处错误。 –

+0

'player1'不是inited,所以你想看到什么值...? – LPs

+0

注意:C不支持_methods_,只有_functions_。 – Olaf

回答

1

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

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

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

还要注意的是

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

错误

当你定义变量可以初始化整个结构。编译器应该抱怨它。你不能分配给一个数组。而且你也不需要为它分配内存。编译器将确保在定义player1变量时分配整个结构的内存。

-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); 
+0

你没有明白。 X和Y #defined –

1

您定义播放器1为local variable,因此,init值不定。

可以 “简单” 使用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]); 

     } 
    } 
} 
+1

这些值是不确定的,而不是随机的。 – Olaf

+0

@Olaf当然,我的英语不好。编辑。 – LPs