Фейл на перевыделении памяти для стека - 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; }
Объяснение кода листинга программы
- В функции
Push
происходит попытка выделения памяти под новый элемент в массиве строк. - Если
count
равен нулю, то выделенный блок памяти вpoints
заменяется на новый блок, выделенный динамически с помощьюmalloc
. - Если
count
больше нуля, то происходит попытка изменения размера массива строк с помощьюrealloc
. - Если
realloc
возвращаетNULL
, то происходит выход из функции с возвратом значенияfalse
. - Если операция
realloc
была успешной, то указатель на массив строкpoints
обновляется, чтобы указывать на новый блок памяти. - Новый элемент массива строк
point
копируется в свободное место в массиве строкpoints
. - Указатель
count
инкрементируется на единицу. - Возвращается значение
true
. - В функции
Pop
происходит попытка освобождения памяти под последний элемент массива строк. - Если
count
меньше или равно нулю, то вpoint
записываетсяNULL
, а возвращается значениеfalse
. - Если
count
больше нуля, то последний элемент массива строк копируется вpoint
. - Указатель
points
освобождается с помощьюrealloc
, который принимает исходный указатель, размер нового массива и количество элементов в новом массиве. - Если
realloc
возвращаетNULL
, то происходит выход из функции с возвратом значенияfalse
. - Если операция
realloc
была успешной, то указатель на массив строкpoints
обновляется, чтобы указывать на новый блок памяти. - Указатель
count
декрементируется на единицу. - Возвращается значение
true
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д