в моем текущем домашнем задании я построил массив динамических указателей, где каждый указатель указывает на структуру данных с некоторыми строками внутри (указывающими на пользователей). Я пытаюсь найти правильный способ удаления определенной ячейки (или пользователя) внутри массива без проблем с кучей памяти.
Итак, я пытался free
конкретную ячейку, а затем сдвинуть другие ячейки, чтобы не осталось пустых ячеек. После этого я попытался «вырезать» последнюю ячейку, которая в настоящее время пуста, с realloc
массивом на -1. Пожалуйста, смотрите комментарии в коде, где я описываю мою проблему.
User** deleteMale(User** pMaleArr, int *maleArrSize, User *onlineUser)
{
int i,j;
//for each array element check if the username matches to the
// connected user
for (i = 0;i < *maleArrSize;i++)
{
if (strcmp(pMaleArr[i]->userName, onlineUser->userName) ==0)
{
//when the user is found, free all fields of the struct
freeUserFields(onlineUser);
//check if it's the last array cell
if (i != *maleArrSize - 1)
{
//shift cells
for (j = i;j < *maleArrSize;j++)
{
pMaleArr[j] = pMaleArr[j + 1];
}//free the last cell
free(pMaleArr[*maleArrSize-1]); //I'm getting a problem here because now the 2 last cells of the array have the same pointer adress.
}
//remove the last cell
pMaleArr = (User **)realloc(pMaleArr, (*maleArrSize
- 1)*sizeof(User*));
if (pMaleArr == NULL)
{
if (*maleArrSize != 1)
{
printf(MA_FAILED);
exit(1);
}
}
break;
}
}
*maleArrSize -= 1;
return pMaleArr;
}
void freeUserFields(User *person)
{
if (person != NULL)
{
//free all fields
free(person->firstName);
free(person->lastName);
free(person->age);
free(person->userName);
free(person->userPassword);
free(person->about);
free(person->hobbies);
//free node itself
free(person);
}
}
Итак, как я заметил выше, когда я пытаюсь free
последнюю ячейку, чтобы впоследствии удалить ее, она также удаляет ячейку (last-1), потому что я скопировал их адреса. Я не могу найти другой способ сдвинуть клетки в этом случае. Могу ли я получить совет, как правильно с этим справиться?
Спасибо!