2016-06-09 65 views
-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); 
    } 
} 

怎麼了?

+2

'movimiento [i] [j] = malloc的(迪斯科舞廳);' - >'movimiento [i] [j ] = malloc(discos * sizeof(int));'。其他地方也一樣,你做類似的'malloc'。 – kaylum

+0

更好的建議:如果您在受支持的平臺(例如Linux)上運行[valgrind](http://valgrind.org)來幫助您找到像這樣的內存損壞。它會爲你節省很多時間。 – kaylum

+0

正如kaylum所說,你忘了用'sizeof(int)'乘'discos'來爲'movemiento [i] [j]'分配適當的內存量。因此,你正在寫入你分配的內存,破壞你的內存狀態。一旦發生這種情況,所有投注都會關閉。 –

回答

-1

而不是三嵌套mallocs和reallocs,這是效率低下,難以保持筆直,只是做你的配置單杆:

size_t total = mov2 * 3 * discos; 
int* movimiento = malloc(total * sizeof(int)); 

現在你可以填補這樣的:

for (size_t ii = 0; ii < total; ++ii) 
    movimiento[ii] = 1; 

然後做出索引功能:

int* get_cell(int* matrix, size_t x, size_t y, size_t z, size_t max_y, size_t max_z) { 
    return &matrix[x*max_y*max_z + y*max_z + z]; 
} 

那麼接下來:

int two = *get_cell(movimiento, mov, 1, pos, 3, discos); 

而當它的時間來釋放內存中,它只是:

free(movimiento); 
+0

問題是我被要求用realloc來做。那麼,有什麼不在我的代碼中工作的想法? –