Фейл на перевыделении памяти для стека - C (СИ)

Узнай цену своей работы

Формулировка задачи:

собственно требовалась работа со стеком, в отладчике определил что прога брякается на Push при первом же перевыделении памяти (на выделении не брякается)
bool Push(POINT *points, int *count, POINT point)
{
    if((*count) < 0) return false;
    if((*count) == 0)
    {
        points = (POINT*) malloc(sizeof(POINT));
        points[*count] = point;
        (*count)++;
    }
    else
    {
        (*count)++;
        points = (POINT*) realloc(points, (*count) * sizeof(POINT));
        points[*count] = point;
    }
    return true;
}
 
POINT* Pop(POINT *points, int *count)
{
    if((*count) <= 0) return NULL;
    POINT point = points[(*count)];
    (*count)--;
    points = (POINT*) realloc(points, (*count) * sizeof(POINT));
    return &point;
}
где ошибка?

Решение задачи: «Фейл на перевыделении памяти для стека»

textual
Листинг программы
bool Push(POINT **points, int *count, POINT *point)
{
    if((*count) < 0) return false;
    POINT *pointer;
    if((*count) == 0) pointer = (POINT*) malloc(sizeof(POINT));
    else pointer = (POINT*) realloc(*points, ((*count) + 1) * sizeof(POINT));
    if(pointer == NULL) return false;
    *points = pointer;
    *points[(*count)++] = *point;
    return true;
}
 
bool Pop(POINT **points, int *count, POINT *point)
{
    if((*count) <= 0)
    {
        point = NULL;
        return false;
    }
    *point = *points[--(*count)];
    POINT *pointer = (POINT*) realloc(*points, (*count) * sizeof(POINT));
    if(pointer == NULL) return false;
    *points = pointer;
    return true;
}

Объяснение кода листинга программы

  1. В функции Push происходит попытка выделения памяти под новый элемент в массиве строк.
  2. Если count равен нулю, то выделенный блок памяти в points заменяется на новый блок, выделенный динамически с помощью malloc.
  3. Если count больше нуля, то происходит попытка изменения размера массива строк с помощью realloc.
  4. Если realloc возвращает NULL, то происходит выход из функции с возвратом значения false.
  5. Если операция realloc была успешной, то указатель на массив строк points обновляется, чтобы указывать на новый блок памяти.
  6. Новый элемент массива строк point копируется в свободное место в массиве строк points.
  7. Указатель count инкрементируется на единицу.
  8. Возвращается значение true.
  9. В функции Pop происходит попытка освобождения памяти под последний элемент массива строк.
  10. Если count меньше или равно нулю, то в point записывается NULL, а возвращается значение false.
  11. Если count больше нуля, то последний элемент массива строк копируется в point.
  12. Указатель points освобождается с помощью realloc, который принимает исходный указатель, размер нового массива и количество элементов в новом массиве.
  13. Если realloc возвращает NULL, то происходит выход из функции с возвратом значения false.
  14. Если операция realloc была успешной, то указатель на массив строк points обновляется, чтобы указывать на новый блок памяти.
  15. Указатель count декрементируется на единицу.
  16. Возвращается значение true.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы