2011-06-13 128 views
2

我寫了下面的代碼。爲什麼這個PHP函數給出了分段錯誤(SIGSEGV)?

<?php 
function f(){ 
    return f(); 
} 
f(); 

,並得到輸出

$ php test.php 
Segmentation fault 

爲什麼?我沒有使用任何指針。

這是StackOverflow?

+2

'f'調用'f'調用'f'調用'f'調用'f'調用'f'調用'f'調用...我也會尖叫分割故障。 – Dan 2011-06-13 07:23:42

+2

我會尖叫「*致命錯誤:達到'100'的最大功能嵌套級別,正在中止!*」或「* PHP致命錯誤:1073741824字節允許的內存大小已用盡(嘗試分配261900字節) 」。 – binaryLV 2011-06-13 07:38:38

+1

「xdebug」是否強制限制爲100? – Dan 2011-06-13 07:46:53

回答

6

這是無限遞歸的情況,但這不是特別的原因。這是一個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的二進制文件失敗了。

2

這不是一個無限遞歸嗎?你想達到什麼目的?

+0

是的,這是一個無限循環。肯定PHP會報錯。 – Raptor 2011-06-13 07:22:57

+0

是的。那就對了 。但SIGSEGV只發生在C/C++代碼上?不是嗎? – freddiefujiwara 2011-06-13 07:23:23

+0

PHP沒有向我報告任何錯誤。 OS說sigsegv – freddiefujiwara 2011-06-13 07:24:07

0

您設置的無限遞歸繼續添加堆棧框架,直到您超出分配給PHP進程調用堆棧的內存量,此時您將獲得segmentation fault

0

這來自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並開始交換,凍結/崩潰您的機器。

相關問題