【问题标题】:Multidimensional array as a structure member memory allocation C多维数组作为结构体成员内存分配 C
【发布时间】:2016-11-17 15:33:00
【问题描述】:

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

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

在我的例子中,X 和 Y 都是 5。

当我在 main 中创建一个新播放器并调用 print_field(int field[X][Y]) 方法(它只是打印 field 的所有成员)

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

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

我尝试了类似 malloc 和 calloc 的不同明显方式

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

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

请解释一下它是如何工作的。

【问题讨论】:

  • 请显示minimal reproducible example。您没有提供足够的信息。我们只能说:在您没有显示的代码中某处存在错误。
  • player1 未初始化,那么您想查看哪些值...?
  • 注意:C不支持方法,只支持函数
  • 那甚至不会编译。您应该在分配给数组时遇到错误。数组不是指针。 malloc 是干什么用的?

标签: c arrays pointers multidimensional-array


【解决方案1】:

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

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

定义变量的时候可以初始化整个结构体:

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

还要注意

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

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

【讨论】:

    【解决方案2】:

    您将播放器 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]);
    
           }
       }
    }
    

    【讨论】:

    • 这些值是不确定的,不是随机的。
    • @Olaf 当然,我的英语不好。已编辑。
    【解决方案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);
    

    【讨论】:

    • 你没有明白。 X 和 Y 是#defined
    猜你喜欢
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多