1

我正在尝试在 SoC 平台(裸机应用程序)上运行以下 C 程序。

我有几个字符串数组,定义为

char *init_array[] = { "foo", "bar bar" }

我知道这可以作为 char 数组的数组工作:*init_array[0] 返回“f”字符,init_array[0] 返回“foo”的第一个地址,&init_array[0] 返回“foo”的第一个地址所在的地址"被保存。我使用的程序基于该定义,因此我不应该更改它。

这些数组正在进入一个循环,其中可能会或可能不会发生外部更改。在接下来的迭代中,数组不得携带“错误”。

我得到的解决方案之一是保留这些数组的两个副本,一个是我要使用的,一个是初始化它们的。

显然,这必须是“安全复制”的,以避免使用相同的地址。我已经实现了这一点,代码如下:

char *my_array[2];

for (int i = 0; i < 2; i++) {

        my_array[i] = malloc(strlen(init_array[i]) + 1);

        memcpy(my_array[i], init_array[i],
                strlen(init_array[i]) + 1);

    }

在这里使用 malloc() (如果可能的话,我宁愿避免)要求在每次迭代结束时使用 free() :

for (int i = 0; i < 2; i++) {

// i know it crashes somewhere here

    free(my_array[i]);
    my_array[i] = NULL; //this is supposed to tackle the issue of the same pointer being freed twice(?)

并且它完美地工作,对于少量的迭代。然后,程序崩溃了,我必须重置我正在使用的平台。正如我上面提到的,我知道它在最后一个循环的某个地方崩溃了。我也读过:

malloc()、calloc()、realloc() 或 free() 中的崩溃几乎总是与堆损坏有关,例如溢出分配的块或释放同一指针两次。

我真的无法弄清楚我做错了什么。这是一个堆损坏问题,我该如何处理或者我从一开始就错了?

4

0 回答 0