【问题标题】:C: Dynamic array of pointers to array of structureC:指向结构数组的指针的动态数组
【发布时间】:2011-01-02 17:24:53
【问题描述】:

我有一个结构和这些结构的二维数组:

typedef struct {
char exit_n;
char exit_s;
char exit_w;
char exit_e;
} room;

room map[MAP_WIDTH][MAP_HEIGHT];

我需要这些结构的指针数组。以下代码编译,但我没有得到想要的结果。有什么帮助吗?这让我很困惑,任何解释都将不胜感激

room *rooms;
rooms = (room*)malloc(sizeof(room*) * ROOM_NUM);
[..]
rooms[n] = map[room_x][room_y];
[..]

【问题讨论】:

    标签: c


    【解决方案1】:

    其实我觉得你想要

    room** rooms;
    rooms = (room**)malloc(sizeof(room*) * ROOM_NUM);
    [..]
    rooms[n] = &map[room_x][room_y];
    

    这会给你一个指向你房间的指针数组。

    【讨论】:

      【解决方案2】:

      我很确定你想要

      sizeof(room)
      

      您需要为结构分配足够的空间。你只是分配一个指针。

      如果您想要一个 2D 数组,您可能还需要进行不同的分配: 看这里dynamic allocating array of arrays in C

      【讨论】:

      • 顺便说一下,在这种特殊情况下 sizeof(room)==sizeof(room*) 在 32 位系统上:D
      【解决方案3】:

      我看到的主要问题是您使用的是sizeof(room*)。这意味着您正在获取指向结构的指针的大小,这不是您想要的。你想分配结构的大小,所以设置sizeof(room)。另外,在这种情况下使用calloc,而不是malloc,因为您基本上是通过将房间数量乘以房间大小来实现前者的功能。

      【讨论】:

      • 这不就像制作另一个 rooms 数组,我想要一组 指向房间的指针
      • 啊,我明白你的意思了。其他一些帖子做得对。
      【解决方案4】:

      在您当前的代码中,rooms 变为 room 结构的数组,而不是指针数组。如果您想要一个指针数组,每个指针都指向您的 map 数组,则需要另一层间接:

      room** rooms = malloc(ROOM_NUM * sizeof *rooms);
      // ...
      rooms[n] = &map[room_x][room_y];
      

      (或者你可以像你的代码一样使用sizeof (room *),而不是sizeof *rooms;我更喜欢这样写,以避免重复类型信息。)

      【讨论】:

      • 在我看来,rooms 应该是访问map 的另一种一维方式,而不是二维方式。
      • 我不这么认为。他有 ROOM_NUM 个房间。我猜 ROOM_NUM 等于地图尺寸的乘积。 room*** 无论如何都不适用于二维数组。
      【解决方案5】:

      您需要为指针和房间分配空间,然后初始化指针以指向房间。

      room *rooms; 
      room **prooms;
      rooms = (room*)malloc((sizeof(room) + sizeof(room*)) * ROOM_NUM); 
      prooms = (room**)(&rooms[ROOM_NUM]);
      for (int ii = 0; ii < ROOM_NUM; ++ii)
         prooms[ii] = &rooms[ii];
      

      【讨论】:

        【解决方案6】:

        如果我理解正确,您需要一个指向map 中所有room 值的指针数组。既然有MAP_WIDTH*MAP_HEIGHT这样的值,我们就需要那么多指针:

        room *rooms[MAP_WIDTH*MAP_HEIGHT];
        

        上面将rooms 声明为一个指针数组。

        现在,分配值:

        size_t i;
        size_t j;
        
        for (i=0; i < MAP_WIDTH; ++i)
            for (j=0; j < MAP_HEIGHT; ++j)
                rooms[i*MAP_HEIGHT+j] = &map[i][j];
        

        我们基本上在map中找到每个元素的地址,并将其存储在rooms中的正确条目中。

        这是你想要的吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-16
          • 1970-01-01
          • 2013-04-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多