-2
我的程序總是在第四次重新分配中失敗,我不明白爲什麼它使得第一個3好,然後失敗。我使用三重指針,並且我試圖調試,並且所有工作都很好,直到第四次重新分配時它說它超出了範圍和分段錯誤。多個Realloc C指針中的錯誤
#include <stdio.h>
#include <stdlib.h>
void rellenar(int ***movimiento, int mov, int discos) {
int j, pos, mov2, ***movimiento2;
mov2 = mov + 1;
movimiento = realloc(movimiento, mov2 * sizeof (int **));
movimiento[mov] = malloc(3 * sizeof (int *)); //3 de torres
for (j = 0; j < 3; ++j) {
movimiento[mov][j] = malloc(discos);
}
printf("%d\n", mov);
for (pos = 0; pos < discos; pos++) {
movimiento[mov][0][pos] = 1;
movimiento[mov][1][pos] = 1;
movimiento[mov][2][pos] = 1;
printf("%d", movimiento[mov-1][0][pos]);
printf("%d", movimiento[mov-1][1][pos]);
printf("%d\n", movimiento[mov-1][2][pos]);
}
}
int main(int argc, char** argv) {
int ***movimiento, i, j, movs = 1, discos = 4, pos, mov;
movimiento = malloc(movs * sizeof (int **));
for (i = 0; i < movs; ++i) {
movimiento[i] = malloc(3 * sizeof (int *)); //3 de torres
for (j = 0; j < 3; ++j) //3 de torres
{
movimiento[i][j] = malloc(discos);
}
}
for (pos = 0; pos < discos; pos++) {
movimiento[0][0][pos] = discos - pos;
movimiento[0][1][pos] = 0;
movimiento[0][2][pos] = 2;
}
for (pos = 0; pos < discos; pos++) {
printf("%d", movimiento[0][0][pos]);
printf("%d", movimiento[0][1][pos]);
printf("%d\n", movimiento[0][2][pos]);
}
for (mov = 1; mov < 6; mov++) {
rellenar(movimiento, mov, discos);
}
}
怎麼了?
'movimiento [i] [j] = malloc的(迪斯科舞廳);' - >'movimiento [i] [j ] = malloc(discos * sizeof(int));'。其他地方也一樣,你做類似的'malloc'。 – kaylum
更好的建議:如果您在受支持的平臺(例如Linux)上運行[valgrind](http://valgrind.org)來幫助您找到像這樣的內存損壞。它會爲你節省很多時間。 – kaylum
正如kaylum所說,你忘了用'sizeof(int)'乘'discos'來爲'movemiento [i] [j]'分配適當的內存量。因此,你正在寫入你分配的內存,破壞你的內存狀態。一旦發生這種情況,所有投注都會關閉。 –