多个Realloc指针中存在故障

多个Realloc指针中存在故障,c,pointers,dynamic,malloc,realloc,C,Pointers,Dynamic,Malloc,Realloc,我的程序在第四个realloc中总是失败,我不明白为什么它先让第三个好,然后又失败了。我使用的是三指针,我试着调试,直到第四个realloc,当它说它超出范围和分段错误时,一切都很好 #include <stdio.h> #include <stdlib.h> void rellenar(int ***movimiento, int mov, int discos) { int j, pos, mov2, ***movimiento2; mov2 =

我的程序在第四个realloc中总是失败,我不明白为什么它先让第三个好,然后又失败了。我使用的是三指针,我试着调试,直到第四个realloc,当它说它超出范围和分段错误时,一切都很好

#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);
    }
 }
#包括
#包括
void rellenar(国际***电影节、国际电影节、国际迪斯科舞厅){
int j,pos,mov2,***MOVIMENTO2;
mov2=mov+1;
moviminento=realloc(moviminento,mov2*sizeof(int**));
moviminto[mov]=malloc(3*sizeof(int*);//3德托雷斯
对于(j=0;j<3;++j){
moviminto[mov][j]=malloc(迪斯科舞厅);
}
printf(“%d\n”,mov);
用于(pos=0;pos

怎么了

与其使用三层嵌套的malloc和realloc(它们效率低下且难以保持直线),不如一次完成分配:

size_t total = mov2 * 3 * discos;
int* movimiento = malloc(total * sizeof(int));
现在您可以这样填充它:

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

int two = *get_cell(movimiento, mov, 1, pos, 3, discos);
当需要释放内存时,只需:

free(movimiento);

moviminto[i][j]=malloc(迪斯科舞厅)-->
moviminto[i][j]=malloc(discos*sizeof(int))。在其他类似的
malloc
的地方也是如此。更好的建议是:如果您在受支持的平台(如Linux)上,请运行以帮助您发现类似的内存损坏。这将为您节省大量时间。正如kaylum所说,您忘记了用
discos
乘以
sizeof(int)
来为
movemiento[i][j]
分配适当的内存量。因此,您正在写入已分配的内存,从而破坏了内存状态。一旦发生这种情况,所有赌注都将被取消。另外,
moviminto=realloc(moviminto,…
无法更新调用方变量。但是sizeof(int)始终为1,因此它不会改变任何内容。我已经尝试过,但仍然不起作用。问题是我被要求使用realloc进行此操作。那么,你知道我的代码中有什么不起作用吗?
free(movimiento);