【发布时间】:2017-07-04 05:46:41
【问题描述】:
我已经完成了一个程序,它可以打开文件(读取二进制文件),并将所有单词(在文件中)保存在一个 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,但不明白为什么在尝试解除分配时会出现此错误。
【问题讨论】:
-
请注意
sizeof(char)始终为 1。 -
刚刚看到:
sizeof(char *)应该是 -
fread(&z, 1, 4, f)?为什么你认为z是四个字节?您还隐含地假设您的数据文件来自与您正在处理的机器具有相同字节序的机器。 -
此代码除了提到的错误之外还有其他基本问题。见Correctly allocating multi-dimensional arrays。
标签: c arrays string memory stdio