Я создал программу, которая открывает файл (читает двоичный файл) и сохраняет все слова (в файле) в массиве символов (динамически распределяется по основанию длины слова) ,
Это код:Освобождение памяти в массивах
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[0] = "first"
a[1] = "second"
a[2] = "third"
, но когда я пытаюсь освободить весь в переменного, как я писал, отладчик останавливается с предупреждением.
Я был вдохновлен этим вопросом для написания своего кода Using Dynamic Memory allocation for arrays, но не понимаю, почему я получаю эту ошибку, когда пытаюсь освободить.
Обратите внимание, что 'sizeof (char)' равно 1. –
просто увидел, что: 'sizeof (char *)' должно быть –
'fread (& z, 1, 4, f)'? Почему вы предполагаете, что 'z' составляет четыре байта? Вы также неявно предполагаете, что ваш файл данных поступает с машины с той же конечностью, что и с той, на которую вы обрабатываете. –