Я написал следующий код.
<?php function f(){ return f(); } f();
и получить результат
$ php test.php Segmentation fault
Зачем? Я не использовал никаких указателей.
Это StackOverflow?
Это случай бесконечной рекурсии, но это не является особой причиной. Это переполнение стека . Когда у вас есть рекурсия, бесконечная или нет, максимальная глубина, которую вы можете пересчитать (добавить в стек), которая основана на размере вашего стека (в байтах).
Технически это бесконечно, но вы не получите никаких ошибок в течение довольно долгого времени:
<?php function f(){ sleep(1); return f(); } f();
То, что вам нужно, известно как base case
в вашей рекурсии, чтобы остановить его, прежде чем он поглотит весь стек.
<?php function f($i){ if($i == 10) return; echo $i; return f(++$i); } f(0);
Который будет печатать от 0 до 9.
segmentation fault
поступает из операционной системы, сообщая, что приложение PHP столкнулось с проблемой добавления в стек. Это не повлияет на ваш сценарий, потому что на системном уровне двоичный код, из которого состоит PHP, сработал.
Разве это не бесконечная рекурсия? Чего вы пытаетесь достичь?
Неограниченная рекурсия, которую вы настроили, продолжает добавлять стековые кадры, пока вы не наберете объем памяти, назначенный стеку вызовов процессов PHP, после чего вы получите ошибку сегментации .
Это происходит специально из расширения XDebug.
Запустив GDB, вы увидите:
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff41f7e48 in xdebug_add_stack_frame (zdata=Cannot access memory at address 0x7fffff5fefa8 ) at /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c:772 772 /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c: No such file or directory. in /build/buildd/xdebug-2.1.0/build-php5/xdebug_stack.c
Если XDebug отключен, он будет выполняться до достижения значения memory_limit
. Если ваш memory_limit
слишком высок, вы можете вывести ОЗУ и начать замену, замораживание / сбой вашей машины.