Я получил структуру, которая определяется следующим образом:Как освободить двойной указатель struct в C?
typedef struct {
char userType; // - The type of the user.
char userName[userName_len]; // - The user's user name.
char password[password_len]; // - The user's password.
char id[id_len]; // - The user's id.
char firstName[userName_len]; // - The users first name.
char lastName[userName_len]; // - The user's surname.
char address[address_len]; // - The user's address.
}Users;
и указатель для этой структуры в главной функции (не глобальный указатель):
Users* users_db = NULL;
заполняет, что база данных из текстового файла и посылая указатель на него, как это:
Fill_Databases(&users_db,&qnty); //qnty is a pointer to Quantity struct used for help.
Fill_Databases передает указатель на другую функцию, как это:
Fill_Users_db(users_db, &*qnty);
В этой функции имеется выделение памяти с использованием calloc.
Теперь мне нужно освободить stucts, и я получаю проблему с рабочим временем «вызвал точку останова».
Я посылаю его Free_Databases функционировать точно так же, как я выделить память для эм и пытается освободить им, как это:
void Free_Users_db(Users** users_db, Quantity qnty)
{
int i;
for (i = 0; i < qnty.Users; i++)
{
free(users_db[i]);
users_db[i] = NULL;
}
free(users_db);
users_db = NULL;
puts("users db free");
}
Что случилось с этим? И какой правильный способ освободить их?
редактирование: Выделение добавлено:
void Fill_Users_db(Users** users_db, Quantity* qnty)
{
//fills the employee database array according to the file
int num_of_users = 0, i;
FILE *file = fopen("Users.txt", "r"); //open the file
if (!file) //if failed to open file
{
printf("Error opening file!\n");
return;
}
fscanf(file, "%d", &qnty->Users);
*users_db = (Users*)calloc(qnty->Users, sizeof(Users)); //allocate memory and nullify elements //used calloc coz it takes 2 arguments and not 1 as calloc.
if (!*users_db)
{
printf("Memory allocation failed!\n");
return;
}
//for each user get data from the file and allocate memory to the relevant struct variables
for (i = 0; !feof(file); i++)
{
fscanf(file, "%s" "%s" "%s" "%s" "%s" "%s", &(*users_db)[i].userType, &(*users_db)[i].userName, &(*users_db)[i].password, &(*users_db)[i].id, &(*users_db)[i].firstName, &(*users_db)[i].lastName);
fgetline(&(*users_db)[i].address, file);
}
fclose(file); //close the file
}
Можете ли вы добавить дополнительный код о том, как вы выделяете память для users_db? – Jay
@Jay добавил (а): –
Обратите внимание: 'feof' на самом деле неверен как циферблат, так как вам нужно прочитать прошлое' EOF'. – Jason