C:内存使用和数组问题

标签 c arrays multidimensional-array malloc free

我有两个数组(代表房间),其中包含在空间中移动的元素。我在论坛上发现了一个有趣的分配内存的方法。这是我正在做的事情: 首先,我创建一个带有一些默认值的空房间。 之后我加入了一些元素。有两个不同的项目。穿过房间的障碍物和元素。我有一个迭代,例如运行 100 次,并将所有项目进一步放置一个坐标。障碍物保持其位置。

每次迭代都必须执行以下操作:

首先它创建一个新的临时房间(new_room)。它复制所有障碍物,因为它们停留在同一位置(id = 3)。接下来,旧房间(room)中的每个项目都会在 new_room 中获得其新坐标。之后我更换了房间,所以房间变成了 new_room。我在内存使用方面遇到了一些大问题。每次使用 createRoomNew() 创建新房间时,我都想释放旧的 new_room。在此实现中,我遇到了段错误。我想是因为函数changeroom()。

我现在真的很困惑,因为我是 C 新手......我希望我指出了我的意思。非常感谢!

item_node ***room;
item_node ***room_new;
void createRoom(int x, int y, int z)
{
    if (room == NULL) {
        item_node *allElements = malloc(x * y * z * sizeof(item_node));
        room = malloc(x * sizeof(item_node **));
        for(int i = 0; i < x; i++)
        {
            room[i] = malloc(y * sizeof(item_node *));

            for(int j = 0; j < y; j++)
            {
                room[i][j] = allElements + (i * y * z) + (j * z);
            }
        }
        for (j = 0; j < x_format; j++) {
            for (k = 0; k < y_format; k++) {
                for (l = 0; l < z_format; l++) {
                    room[j][k][l].id = 3;
                    room[j][k][l].next = NULL;
                }
            }
        }
    }
}
void createRoomNew(int x, int y, int z)
{
    if (room_new != NULL) {
        for(int i = 0; i < x; i++)
        {
            free(room_new[i]);
        }
        free (room_new);
        room_new = NULL;
    }

    if (room_new == NULL) {
        item_node *allElements = malloc(x * y * z * sizeof(item_node));
        room_new = malloc(x * sizeof(item_node **));
        for(int i = 0; i < x; i++)
        {
            room_new[i] = malloc(y * sizeof(item_node *));

            for(int j = 0; j < y; j++)
            {
                room_new[i][j] = allElements + (i * y * z) + (j * z);
            }
        }
    }
    for (j = 0; j < x_format; j++) {
        for (k = 0; k < y_format; k++) {
            for (l = 0; l < z_format; l++) {
                if ((room[j][k][l].next) != NULL) {
                    if ((room[j][k][l].next->id) == 1) {
                        room_new[j][k][l] = room[j][k][l];
                    } else {
                        room_new[j][k][l].id = 3;
                        room_new[j][k][l].next = NULL;
                    }
                }
                else {
                    room_new[j][k][l].id = 3;
                    room_new[j][k][l].next = NULL;
                }
            }
        }
    }
}
void changeRoom(item_node *** newRoom)
{
    room = newRoom;
}

调用示例:

createRoom(200, 200, 200);
createRoomNew(200, 200, 200);
changeRoom(room_new);
createRoomNew(200, 200, 200);
changeRoom(room_new);

最佳答案

从代码来看,您似乎认为当您免费时,例如free(room_new) room_new 最终被设置为 NULL。事实并非如此

free() 不会将指针设置为 NULL(它不能),它仍然指向它所指向的任何位置,只是内存不再可用。释放后需要手动将指针设置为NULL。

关于C:内存使用和数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248500/

相关文章:

c - 指针赋值问题

c++ - 优化调用函数指针数组

javascript - ruby 将数组传递给 google javascript

php - 比较数组和数据库表,如果找到任何匹配项,则获取 img url 并插入到 PHP 中

Javascript - 处理多维数组

c - Malloc 是否分配了比需要的更多的内存?

c - F.3 操作,9 列出 5 个 FE_ 宏,后跟 4 个 IEEE 754 舍入方向属性,以 "respectively": mistake? 结尾

比较内存地址

java - 打印二维数组中的最大数字 - 为什么我的代码打印三个数字

python - 不使用 Numpy 打印棋盘格