Intereting Posts
Причины сильного ввода параметров в PDO? Запрос превысил предел 10 внутренних переадресаций Сделать pdo :: query static Выберите строки в качестве столбцов для сообщения wordpress meta Laravel 5.3 использует специальную проверку cakephp сохраняет данные обновления из старого значения данных + новое значение Предварительная загрузка изображений с использованием PHP и jQuery – массив с запятой? PHP | Почему я должен использовать статическую / приватную статическую функцию вместо функции public / private? Регулярное выражение в JavaScript не такое же, как в PHP Как обновить сводную таблицу на laravel? Может ли простая модель просто расширить Zend_Db_Row (по существу, Active Record)? Ошибка сертификата с использованием IMAP в PHP Обновление живых данных (например, индикатор выполнения) с Laravel 4 PHP: отображать содержимое после принудительной загрузки? Что возвращает $ _GET , если ключ не установлен?

Почему эта функция PHP дает ошибку сегментации (SIGSEGV)?

Я написал следующий код.

<?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 слишком высок, вы можете вывести ОЗУ и начать замену, замораживание / сбой вашей машины.