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