我寫了下面的代碼。爲什麼這個PHP函數給出了分段錯誤(SIGSEGV)?
<?php
function f(){
return f();
}
f();
,並得到輸出
$ php test.php
Segmentation fault
爲什麼?我沒有使用任何指針。
這是StackOverflow?
我寫了下面的代碼。爲什麼這個PHP函數給出了分段錯誤(SIGSEGV)?
<?php
function f(){
return f();
}
f();
,並得到輸出
$ php test.php
Segmentation fault
爲什麼?我沒有使用任何指針。
這是StackOverflow?
這是無限遞歸的情況,但這不是特別的原因。這是一個stack overflow。當你有遞歸時,無論是否是無限的,都有一個最大深度可以遞增(加入堆棧),這是基於棧的大小(以字節爲單位)。
技術上這是無限的,但你不會得到任何錯誤相當長的一段:
<?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會報錯。 – Raptor 2011-06-13 07:22:57
是的。那就對了 。但SIGSEGV只發生在C/C++代碼上?不是嗎? – freddiefujiwara 2011-06-13 07:23:23
PHP沒有向我報告任何錯誤。 OS說sigsegv – freddiefujiwara 2011-06-13 07:24:07
您設置的無限遞歸繼續添加堆棧框架,直到您超出分配給PHP進程調用堆棧的內存量,此時您將獲得segmentation fault。
這來自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
太高,則可能會耗盡RAM並開始交換,凍結/崩潰您的機器。
'f'調用'f'調用'f'調用'f'調用'f'調用'f'調用'f'調用...我也會尖叫分割故障。 – Dan 2011-06-13 07:23:42
我會尖叫「*致命錯誤:達到'100'的最大功能嵌套級別,正在中止!*」或「* PHP致命錯誤:1073741824字節允許的內存大小已用盡(嘗試分配261900字節) 」。 – binaryLV 2011-06-13 07:38:38
「xdebug」是否強制限制爲100? – Dan 2011-06-13 07:46:53