c - 为什么在尝试释放字符串数组时出现此错误

标签 c arrays multidimensional-array dynamic-memory-allocation

我想知道如何正确释放这个数组,这样我在编译文件时就不会遇到下一个错误。 “ooo”是我存储在数组中的字符串

ooo
ooo
ooo
ooo

Error in `./a.out': munmap_chunk(): invalid pointer: 0x0000000000400774
Aborted (core dumped)

我正在学习 C,如果有人能告诉我如何修复错误以及发生错误的原因,我将不胜感激。

代码如下:

#include <stdio.h>
#include<stdlib.h>
#define width 5
#define height 10

char** arrayFunction(){

    char** arrayInFunction = malloc(height * sizeof(char*));
    for(int i=0; i < height; i++){
        arrayInFunction[i] = malloc(width * sizeof(char));
    }
    return arrayInFunction;
    
}
int main()
{
    char** array = arrayFunction();
    array[0] = "ooo";
    array[1] = "ooo";
    array[2] = "ooo";
    array[3] = "ooo";

    for(int i=0; i < height; i++){
    printf("%s\n",array[i]);

    }
    
    //free the array created in main
    for(int i=0; i < height; i++){
    free(array[i]);
    }
    free(array);

    return 0;
}

最佳答案

数组[0] = "ooo";

这会将 array[0] 中的 char *(指向某个 char 的指针)更改为指向 的第一个字符>“哦”。它现在不再指向您刚刚分配的内存。

因此,当您尝试释放此内存时,您会遇到未定义的行为(= 在您的情况下崩溃和错误)。

您需要将 C 字符串 "ooo" 的内容复制到分配的内存中,例如使用 strcpy或(更好)strncpy .


可视化;之前:

array: [0][1][2][3][4]
        |
        v
       [?][?][?]... (the memory you allocated)

之后:

array: [0][1][2][3][4]
      __|
     |  
     | [?][?][?]... (the memory you allocated, now lost; a memory leak)
     |
     v
   ['o']['o']['o']['\0'] (the C literal, wherever the C compiler saved it)

其他问题:

#define width 5
#define height 10

最好使用 const 变量,或者更好地使 arrayFuntion 的这两个参数(应该命名得更好!)。

array[3] = "ooo";

for(int i=0; i < height; i++)

array[4] 未初始化。访问它(在循环中)是未定义的行为。

char** arrayInFunction = malloc(height * sizeof(char*));

尽可能避免 sizeof(TYPE),使用 sizeof(EXPRESSION) 更安全,例如对于以上:

char** arrayInFunction = malloc(height * sizeof(*arrayInFunction));

与其他 sizeof 表达式相同。

return 0;

main 中不需要。

关于c - 为什么在尝试释放字符串数组时出现此错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964782/

相关文章:

c - 读取纺织品并添加到 C 中的链接列表

Java 对象数组

arrays - 如何以蜗牛模式单次循环遍历二维数组?

java - 将值保存到二维数组中

java - 我需要从这个 2D String 方法返回什么?

c - 表达式必须有指针类型错误

c - 使用memcpy方法

c - 如何调用编译时声明未知的函数

C中的字符数组比较

c++ - 返回一个指针数组?