多个Realloc指针中存在故障
我的程序在第四个realloc中总是失败,我不明白为什么它先让第三个好,然后又失败了。我使用的是三指针,我试着调试,直到第四个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 =
#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);