Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stack overflow 堆栈溢出异常、无限循环或实际堆栈溢出_Stack Overflow_Infinite Loop - Fatal编程技术网

Stack overflow 堆栈溢出异常、无限循环或实际堆栈溢出

Stack overflow 堆栈溢出异常、无限循环或实际堆栈溢出,stack-overflow,infinite-loop,Stack Overflow,Infinite Loop,如果我将其与参数0,0,0,15一起输入,则会出现堆栈溢出异常。。这可能是什么原因?是无限递归还是对堆栈来说太多了?照明3D阵列的大小为16*16*128 private void updateLight(int x, int y, int z, byte lightValue) { if (lightValue == 1 || lighting[x][z][y] != -1 || voxels[x][z][y] != 0) { return; } li

如果我将其与参数0,0,0,15一起输入,则会出现堆栈溢出异常。。这可能是什么原因?是无限递归还是对堆栈来说太多了?照明3D阵列的大小为16*16*128

private void updateLight(int x, int y, int z, byte lightValue) {
    if (lightValue == 1 || lighting[x][z][y] != -1 || voxels[x][z][y] != 0) {
        return;
    }

    lighting[x][z][y] = lightValue;

    if (x - 1 >= 0) {
        updateLight(x - 1, y, z, --lightValue);
    }
    if (x + 1 < lighting.length) {
        updateLight(x + 1, y, z, --lightValue);
    }
    if (z - 1 >= 0) {
        updateLight(x, y, z - 1, --lightValue);
    }
    if (z + 1 < lighting[0].length) {
        updateLight(x, y, z + 1, --lightValue);
    }
    if (y - 1 >= 0) {
        updateLight(x, y - 1, z, --lightValue);
    }
    if (y + 1 < lighting[0][0].length) {
        updateLight(x, y + 1, z, --lightValue);
    }

}
private void updateLight(int x,int y,int z,byte lightValue){
如果(lightValue==1 | |照明[x][z][y]!=-1 | |体素[x][z][y]!=0){
返回;
}
光照[x][z][y]=光照值;
如果(x-1>=0){
updateLight(x-1,y,z,--lightValue);
}
如果(x+1<照明长度){
updateLight(x+1,y,z,--lightValue);
}
如果(z-1>=0){
updateLight(x,y,z-1,--lightValue);
}
如果(z+1<照明[0]。长度){
updateLight(x,y,z+1,--lightValue);
}
如果(y-1>=0){
updateLight(x,y-1,z,--lightValue);
}
如果(y+1<照明[0][0]。长度){
updateLight(x,y+1,z,--lightValue);
}
}

看起来第一个调用将达到第二个条件,并调用
updateLight(x+1,y,z,--lightValue)
updateLight(1,0,0,14)。然后,该递归调用将命中第一个条件,并调用
updateLight(x-1,y,z,--lightValue)
updateLight(0,0,0,13)。由于没有任何条件依赖于lightValue,因此就流控制而言,这与第一次调用相同。所以它只是在这两个递归调用之间来回反弹,直到堆栈溢出


您应该能够在调试器中轻松验证这一点。

这不是循环,而是recursion@Alex哎哟,这就是我的意思。要得到stackoverflow,它不应该是无限的,只是比你的stack还多。@Alex我知道。但我有点怀疑,当大多数操作立即被过滤时,16*16*128操作的堆栈是否会溢出。这就是为什么我要问这里是否有无限递归。你可以签入调试器