機能に問題があり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);
これにより、2 次元配列 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;
}
前もって感謝します。
編集
- 愚かな私。
realloc
Karl Knechtel が指摘したように、私は の戻り値で何もしていませんでした。しかし、今では実行するたびにプログラムがクラッシュします。 - Bart van Ingen Schenau の回答で、私が恐れていたことを確認しました。以前に割り当てたいくつかの独立したメモリ ブロックを無視していたのです。Bart によって書かれたものと同様のコードになってしまいましたが、引き続きプログラムをクラッシュさせます。
- /呼び出し
assert
の結果を確認するために 's を追加しましたが、うまくいきませんでした。私は Win98 で djgpp を使用していますが、何が起こっているのかは本当に奇妙です:malloc
realloc
- Windows: クラッシュしないこともあります。それ以外では、2 行追加するとクラッシュします。
- MS-DOS: 2 行を追加するとクラッシュします。追加の手がかりを得るために、gcc で -O3 を使用してみます。Windows 用の便利な (そしてすぐに習得/使用できる) メモリ破損/リーク検出ツールは何でしょうか? Purify は最適なソリューションですか?
- 配列を解放する関数でさえ、ページ フォールトを返しています。