У меня проблемы с функцией realloc
.
Я выделяю динамический двумерный массив с помощью этой функции:
Bubble ***allocBubblesMatrix(int height, int width) {
Bubble ***bubblesMatrix = (Bubble***) malloc(height * sizeof(Bubble**));
assert(bubblesMatrix != NULL);
int i;
for (i = 0; i < height; ++i) {
bubblesMatrix[i] = (Bubble**) malloc(width * sizeof(Bubble*));
assert(bubblesMatrix[i] != NULL);
}
int x, y;
for (y = 0; y < height; ++y)
for (x = 0; x < width; ++x)
bubblesMatrix[y][x] = newBubble(rand() % N_BUBBLES);
return bubblesMatrix;
}
который вызывается со следующим кодом:
int matrixHeight = 1,
matrixWidth = MATRIX_X_SIZE;
Bubble ***bubblesMatrix = allocBubblesMatrix(matrixHeight, matrixWidth);
Это успешно создает двумерный массив 1 * MATRIX_X_SIZE.
Затем я хочу добавить в матрицу строку или несколько строк, поэтому я использую realloc
со следующей функцией. Предполагается добавить heightIncrement
строк. Проблема в том, что иногда это работает, а другое - вылетает программа.
void resizeBubblesMatrix(Bubble ****bubblesMatrix, int height, int width,
int heightIncrement) {
if (heightIncrement <= 0) /* temporary */
return;
*bubblesMatrix = (Bubble***) realloc(*bubblesMatrix, (height + heightIncrement) * sizeof(Bubble**));
assert(bubblesMatrix != NULL);
int x, y;
int newHeight = height + heightIncrement;
for (y = height; y < newHeight; ++y) {
(*bubblesMatrix)[y] = (Bubble**) malloc(width * sizeof(Bubble*));
assert((*bubblesMatrix)[y] != NULL);
for (x = 0; x < width; ++x)
(*bubblesMatrix)[y][x] = newBubble(rand() % N_BUBBLES);
}
}
Эта функция вызывается с помощью:
while(true) {
drawBubblesMatrix(x1, y1, matrixHeight, matrixWidth, &bubblesMatrix, bubbles);
resizeBubblesMatrix(&bubblesMatrix, matrixHeight, matrixWidth, 1);
++matrixHeight;
getch();
clear_screen(1);
}
Что я делаю не так?
Функция для освобождения ранее выделенных блоков памяти:
void freeBubblesMatrix(Bubble ****bubblesMatrix, int height, int width) {
int y, x;
for (y = 0; y < height; ++y) {
for (x = 0; x < width; ++x) {
free((*bubblesMatrix)[y][x]);
(*bubblesMatrix)[y][x] = NULL;
}
free((*bubblesMatrix)[y]);
(*bubblesMatrix)[y] = NULL;
}
free(*bubblesMatrix);
*bubblesMatrix = NULL;
}
Заранее спасибо.
EDIT
- Глупый я. Я ничего не делал с возвращаемым значением
realloc
, как указал Карл Кнехтель. Но теперь программа вылетает при каждом запуске.
- Ответом Барта ван Ингена Шенау я подтвердил то, чего боялся: я игнорировал несколько независимых блоков памяти, которые я выделил ранее. Я даже получил код, похожий на тот, что написал Барт, но он продолжает сбой программы.
- Я добавил
assert
для проверки результатов вызовов malloc
/ realloc
, и все же мне не повезло. Я использую djgpp с Win98, и то, что происходит, действительно странно:
- Windows: иногда он никогда не падает; другие вылетает после добавления 2 строк.
- MS-DOS: сбой после добавления 2 строк.
Я попытаюсь использовать -O3 с gcc, чтобы получить дополнительные подсказки. Что может быть полезным (и быстрым в изучении / использовании) средством повреждения памяти / обнаружения утечек для Windows? Является ли Purify лучшим решением?
- Даже моя функция по освобождению массива возвращает ошибки страницы.