удалить место из динамического массива потерянных указателей - c - PullRequest
0 голосов
/ 04 января 2019

Я получаю потерянные байты каждый раз, когда удаляю место в массиве.В первый раз я сделал: ///*mens[index] = mens[index + 1];*/, но это сделало больше потерянных байтов. Хотелось бы получить вашу помощь !!

user_** deleteMen(user_** mens,int* numMens, int index)
{

    int f;
    if (index >=(*numMens))
    {
        printf("Error\n");
        return mens;
    }
    //free the index string
    free(mens[index]->userName);
    free(mens[index]->description);
    free(mens[index]->password);
    free(mens[index]->name);
    free(mens[index]->lastName);
    free(mens[index]->userId);
    for (f = index; f < *numMens - 1; f++)
    {
        mens[f]->age = mens[f + 1]->age;
        mens[f]->description = mens[f + 1]->description;
        mens[f]->gender = mens[f + 1]->gender;
        mens[f]->hobbies = mens[f+ 1]->hobbies;
        mens[f]->lastName = mens[f + 1]->lastName;
        mens[f]->name = mens[f + 1]->name;
        mens[f]->password = mens[f + 1]->password;
        mens[f]->userId = mens[f + 1]->userId;
        mens[f]->userName = mens[f + 1]->userName;
    }
    free(mens[*numMens - 1]->description);
    free(mens[*numMens - 1]->lastName);
    free(mens[*numMens - 1]->name);
    free(mens[*numMens - 1]->password);
    free(mens[*numMens - 1]->userId);
    free(mens[*numMens - 1]->userName);
    free(mens[*numMens - 1]);
    mens= (user_**)realloc(mens, (*numMens-1) * sizeof(user_*));
    if (mens == NULL)
        if (*numMens != 1)
            exit(1);
    *numMens-=1;
    return mens;
}

1 Ответ

0 голосов
/ 04 января 2019

Для начала: вы используете со знаком int для индексов и num.Тогда входной сигнал может быть отрицательным (!), Поэтому вам придется проверить.Вы избежите этой проблемы, если используете типы unsigned (особенно, поскольку отрицательные индексы и длины массивов в любом случае не имеют смысла).Лично я бы использовал size_t для.

Немного сократил ваш код:

free(mens[index]->userName);
// ...
for (f = index; f < *numMens - 1; f++)
{
    mens[f]->age = mens[f + 1]->age;
    // ...
}

// these are wrong: you moved them to preceeding list element already
// (unless it was the last element itself, but then you freed them directly
// before entering the loop)
free(mens[*numMens - 1]->description);

// but I assume you instead want to delete the last element instead:

free(mens[*numMens - 1]);

Вы можете упростить эту часть, хотя:

free(mens[index]->userName);
// ...

free(mens[index]);

for (f = index; f < *numMens - 1; f++)
{
    mens[f] = mens[f + 1];
}

-alloc часть сомнительна, хотя:

  1. результат прохождения нулевого размера равен определена реализация - вы можете получить или не получить нулевой указатель, память может илине может быть освобожден.
  2. Начиная с C11, поддержка нулевого размера устарела.

Уменьшение размера памяти может заставить пользователя функции перейти на новый realloc, как только онаили он добавляет другой элемент в массив, который может быть не в ее / ее пользу ...

Моя личная рекомендация:

typedef struct
{
    size_t size;
    size_t capacity;
    user_** data; // maybe even better: user_* data??? - depends on use case, though
} List;

Эта структура объединяет все соответствующие данные в одном месте, если вы используете его для своих функций вставки / удаления, вам лучше.Вы бы увеличили объем памяти, если бы ее не хватало, но оставили бы сокращение для пользователя (хотя, возможно, для удобства у вас есть отдельная функция).

Если вы чувствуете, что напомнили C ++: Да, основная идея украденаоттуда (std::vector) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...