Фейл на перевыделении памяти для стека - 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.