C:内存使用和阵列问题

C:内存使用和阵列问题,c,arrays,multidimensional-array,malloc,free,C,Arrays,Multidimensional Array,Malloc,Free,我有两个数组(表示房间),其中的项目在空间中移动。我在论坛中找到了一种分配ram的有趣方法。以下是我正在做的: 首先,我用一些默认值创建一个空房间。 然后我加入了一些元素。有两个不同的项目。穿过房间的障碍物和物品。我有一个迭代,例如运行100次,并将所有项目进一步放置一个坐标。障碍物保持其位置 每次迭代都必须执行以下操作: 首先,它创建一个新的临时房间(new_room)。它复制所有障碍物,因为它们位于同一位置(id=3)。接下来,来自旧房间(房间)的每个项目在新房间中获得新坐标。之后我换了房间

我有两个数组(表示房间),其中的项目在空间中移动。我在论坛中找到了一种分配ram的有趣方法。以下是我正在做的: 首先,我用一些默认值创建一个空房间。 然后我加入了一些元素。有两个不同的项目。穿过房间的障碍物和物品。我有一个迭代,例如运行100次,并将所有项目进一步放置一个坐标。障碍物保持其位置

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

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

我现在真的很困惑,因为我是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;
}

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


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

代码中没有3D数组。请更改标题和文字。请注意,成为一名C语言的三星级程序员并不是一种恭维。您应该学会正确使用malloc。尝试使用小示例并使用
valgrind
(或其他内存调试器)进行调试,以了解发生了什么。您的Malloc是错误的,请先尝试2D示例。您已编辑,但未得到提示。请注意,指针不是数组,反之亦然。你的方法效率低下。你似乎只需要两个数组(!),它们可以互换使用,类似于游戏中的屏幕缓冲区翻转:先画到隐藏处,然后交换。你好,奥拉夫,是的,我知道,但更多的是关于我如何在脑海中想象它,以及我如何在房间中表现它……一般的malloc功能是有效的,只有在我第二次使用它时才会弄乱。我想是因为更衣室。我只是想得到一点提示,看看到底是什么地方出了问题,也许是订单的问题。谢谢你,这很有帮助。我没想到。第二次调用createRoomNew()时,我在if((room[j][k][l].next->id)==1)行中遇到了分段错误{你知道为什么会发生这种情况吗?谢谢!到目前为止,在createRoomNew中,你可以释放room_new,但由于你没有将它设置为null,第二个if语句将永远不会执行。当你稍后尝试取消引用它时,它将崩溃。谢谢!我添加了你的建议,但我仍然在同一个地方得到相同的SEGFULT…在其他世界中ds:你能想象为什么我第二次调用它时会发生这种情况吗?谢谢!:)你是否设置过
next
,似乎你只是将它设置为NULL。你尝试过调试器吗?你没有提供足够的代码供人们构建它并重新创建问题。
createRoom(200, 200, 200);
createRoomNew(200, 200, 200);
changeRoom(room_new);
createRoomNew(200, 200, 200);
changeRoom(room_new);