【问题标题】:Why how do i this error when trying to free an array of strings为什么在尝试释放字符串数组时出现此错误
【发布时间】:2020-01-17 18:13:16
【问题描述】:

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

哦哦
呜呜
呜呜
哎哟

`./a.out' 中的错误:munmap_chunk():无效指针: 0x0000000000400774
中止(核心转储)

我正在学习 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;
}

【问题讨论】:

  • 行:replace array[0] = "ooo";` 将位于内存位置 array[0] 中的指针设置为指向存储指定值的受保护内存数组细绳。您很可能无法释放该内存。您要做的是使用标准库函数strcpy 将字符串"ooo" 复制到您之前在arrayFunction 例程中分配的内存位置。

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


【解决方案1】:

array[0] = "ooo";

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

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

您需要将 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 中不需要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多