我大约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));
但是我得到了不同类型的指针,数组或强制转换异常。
请解释我是如何运作的。
答案 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);