2016-06-09 69 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来做。那么,有什么不在我的代码中工作的想法? –