我已经完成了打开文件的程序(读取二进制文件),并将所有单词(在文件中)保存在char数组中(在单词长度的基础上动态分配)。 /> 这是代码:
char **leggi_stringhe(const char *filename, size_t *size) {
FILE *f = fopen(filename, "rb");
if (f == NULL) {
*size = 0;
return NULL;
}
int x;
if (fread(&x, 1, 4, f) != 4) {
*size = 0;
return NULL;
}
char **stringhe = malloc((x) * sizeof(char));
for (int i = 0; i < x; i++) {
int z = 0;
if (fread(&z, 1, 4, f) != 4) {
*size = 0;
return NULL;
}
stringhe[i] = malloc((z)* sizeof(char));
if (fread(stringhe[i], 1, z, f) != z) {
*size = 0;
return NULL;
}
stringhe[i][z] = 0;
}
*size = x;
fclose(f);
return stringhe;
}
int main(void) {
size_t t;
char **a = leggi_stringhe("file1.bin", &t);
for (int i = 0; i < t; i++)
free(a[i]);
free(a);;
}
该程序有效,但我有内存释放问题。 在调用 leggi_stringhe 函数后,变量 a 包含:
a[0] = "first"
a[1] = "second"
a[2] = "third"
但是当我试图在我写的时候解除整个 a 变量时,调试器会停止并发出警告。
编写我的代码Using Dynamic Memory allocation for arrays时,我受到了这个问题的启发,但是当我尝试解除分配时,我不明白为什么会出现此错误。
答案 0 :(得分:4)
您对malloc
的初次调用是错误的。您为x
个字符分配空间,而不是指向char
的指针。
你在循环中的第二次调用是错误的,因为你没有为终结符分配空间。
最后,与您提出的问题无关,但如果循环内的fread
调用失败,则会出现内存泄漏。
答案 1 :(得分:1)
您的代码存在一些问题:
这一行:
char **stringhe = malloc((x) * sizeof(char));
需要:
char **stringhe = malloc((x) * sizeof(char*)); /* or sizeof *stringhe */
因为您需要为x
分配char*
stringhe
指针。
在第一个for循环中,您没有为null-terminator添加+1
。它需要改为:
stringhe[i] = malloc(z+1); /* sizeof(char) = 1 */
您需要检查malloc()
的返回。如果不成功,它可以返回NULL
。您只需选中if (ptr == NULL)
即可完成此操作,然后退出该程序。允许失败的malloc()
继续在程序中是不安全的。
for (int i = 0; i < t; i++)
正在将int
与size_t
进行比较。这应该是for (size_t i = 0; i < t; i++)
。