固定PHP 5.3.5数组存在分段错误

问题描述

| 尝试定义这样的数组时:
$array = new SPLFixedArray(256);

for ($i = 0; $i < 256; $i++) {
    $array[$i] = new SPLFixedArray(256);

    for ($j = 0; $j < 256; $j++) {
        $array[$i][$j] = new SPLFixedArray(5);

        for ($k = 0; $k < 5; $k++) {
            $array[$i][$j][$k] = 0;
        }
    }
}
我只能在CLI中获得“分段错误”。我在C / C ++中的SO上读到了此类错误,那里可能是内存问题,建议使用malloc()将所有内容加载到堆内存中。在PHP中,我们有这样的工具吗? 即使在小型3d阵列中也会发生这种情况,例如15而不是256(但在15以下工作)。 谢谢!     

解决方法

        只有PHP错误会出现段错误;您应该永远无法做到这一点。它在PHP 5.3.5上对我来说是段错误。我在5.3.6的更改日志中看不到任何内容表明已修复。 (对我来说,它在5.3.6上也崩溃了。) 作为解决方法,您可以执行以下操作:
$array = new SplFixedArray(256 * 256 * 5);
$array[$i * JK + $j * K + $k] = $foo;
JK和K是常数。
JK = $jsize * $ksize;
K = $ksize
。 无论如何,与创建3D阵列相比,这可能会给您带来更好的性能。 更新: 我在PHP 5.3.7-dev上尝试过,并且没有segfault。因此,已经克服了这一问题,该问题已得到修复,可以在PHP 5.3.7中正常工作。     ,        您没有说您正在运行哪个PHP版本。不确定是否可以关联,但是SPLFixedArrays发布了一个错误,6月初在快照中移植了一个修复程序。 您可以对快照尝试代码,看看它是否解决了您的问题(Linux快照或Windows快照)。     ,        该段故障可能来自操作系统级别,告诉您已破坏堆栈。话虽如此,您之所以要破坏堆栈,是因为您从循环嵌套中调用了SplFixedArray()多次调用。这就是为什么像您提到的那样,在小型3D阵列中,它也会被破坏的原因。 话虽这么说,如果可能的话,尽量不要有这样的嵌套。这等效于无限递归。更不用说PHP的基础机制仍然是C。 希望能帮助到你!干杯!