c - Malloc 'ing 结构中的结构数组

标签 c arrays struct

我已经做了一段时间的研究,但没有找到任何对我有帮助的东西。

我有以下结构声明:

typedef struct position_struct{
    int x;
    int y;
} pos;

typedef struct item_struct{
    char member1;
    pos member2;
} item;

typedef struct room_stuct{
    item * member3;
    pos * member4;
    pos member5;
} roomLayout;

尝试 malloc 的代码是(为简洁起见,我删除了错误检查):

 roomLayout *genFloor () {
                                                         // Allocate mem for Arrays of:
    roomLayout * room = malloc(sizeof(roomLayout) * 6 ); //     6 rooms
    room->member3     = malloc(sizeof(item)       * 10); //     10 member3's
    room->member4     = malloc(sizeof(pos)        * 10); //     10 member4's

    /* TESTING */
    room[0].member3[0].member1 = 'd';
    printf("Room[0] is good\n");
    room[1].member3[0].member1 = 'd';
    printf("Room[1] is good\n");           // Never prints/makes it to this line


    return room;
 }

当我尝试这样做时,分配给 room[1] 会导致崩溃,但不会导致 room[0]。我的猜测是我实际上没有为整个阵列分配足够的空间,只有一个位置。但我不明白为什么,因为我相信我正在遵循我在其他地方看到的东西。

如果有人可以向我解释为这种设置分配内存的过程,那将非常有帮助!谢谢。

最佳答案

您只为第一个房间分配了member3member4;不适合所有人。在room->member3这一行中,room在内存段的开头,也就是在room[0]处,为10个成员。然而,room[1] 没有为任何成员分配任何空间(门也是如此)。通过在循环中分配来解决这个问题:

for(i = 0; i < 6; ++i)
{
    room[i].member3 = malloc(sizeof(room[i].member3) * 10);
    room[i].member4 = malloc(sizeof(room[i].member4) * 10);
}

释放内存时,记得使用类似的循环,即

for(i = 0; i < 6; ++i)
{
    free(room[i].member3);
    free(room[i].member4);
}

free(room);

关于c - Malloc 'ing 结构中的结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35089603/

相关文章:

c - perl 和 C 脚本的管道

c++ - Linux ext3 和 ext4 文件 - 兼容性问题

c - 如何在C文件中运行shell命令并在变量中分配一个整数?

arrays - C:定义具有 64 位对齐起始地址的数组的可移植方法?

C 在 struct free() 中动态分配结构

c - 如何使用 execvp()

java - HashMap 元素的 ArrayList 到 Array

c - 在 C 中将 strsep() 与动态字符串数组一起使用

c - 如何对这些结构进行编程?

objective-c - 具有 Swift 结构的 C API - 作为 inout 参数的不可变值