爲什麼我看到分割錯誤? 代碼:當我嘗試調用它主要工作幾次,但後來我得到分割錯誤
#include<stdio.h>
int main()
{
puts("WORK");
main();
}
[] []
爲什麼我看到分割錯誤? 代碼:當我嘗試調用它主要工作幾次,但後來我得到分割錯誤
#include<stdio.h>
int main()
{
puts("WORK");
main();
}
[] []
C++標準3.6.1/3不允許你打電話main()的內部主()
的功能主要不應被一個程序中使用的(3.2)。主要的連接(3.5)是實現定義的。聲明main爲內聯或靜態的程序是不合格的。名稱main不保留。 [例如:成員函數,類和枚舉可以稱爲main,其他名稱空間中的實體也可以稱爲main。 ]
你最終會得到一個堆棧溢出(實際上它是通過調用內部的主主未定義行爲)
的使用(3.2)說:
對象或者如果其名稱出現在 潛在評估的表達式中,則使用非重載函數。
而且也看到這一點:
5.2.2.9
「遞歸調用是允許的,除了名爲主要功能」
啊,你打我吧:) –
添加到這一點 - 離開主要是提示編譯器銷燬所有靜態初始化的對象。如果你多次進入並離開主體會發生什麼?根據我認爲的實施情況,它會變得非常困惑。 –
那麼爲什麼g ++沒有給出任何錯誤消息,它執行puts(「WORK」);聲明幾次,因爲我在截圖 –
究竟似乎發生纔是真正的stack overflow。你有一個遞歸函數,它會進入無限遞歸,所以在某個時刻它會用完堆棧。
首先,你最終得到堆棧溢出,因爲你有一個無限的遞歸。你認爲會發生什麼?
其次,標準C++不允許您撥打main
。你的代碼是無效的,並且編譯器會這樣做(而且聰明)。
更好的問題是你預計這個代碼會發生什麼?
你有一個無限遞歸函數,不斷添加到標準輸出流。當然,你會遇到一個錯誤,你會不斷地將「WORK」字符串分配到堆棧上,這會溢出。當您將太多數據推入標準輸出流時,我不確定會發生這種情況,但這也無法保證健康。
只是爲了增加一些實用的相關信息:
這是你要做得到警告:
的gcc -Wall測試。ç
警告:控制到達非void函數結束[-Wreturn型]
其對什麼也不說主(我希望它會展示一些東西)
這是如果你在gdb運行應用程序回溯:
gdb ./a.out
..
Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7a8dffe in _IO_new_file_write (f=0x7ffff7dd4400 <_IO_2_1_stdout_>, data=0x7ffff7ff7000, n=5) at fileops.c:1261 1261 fileops.c: No such file or directory. (gdb) bt
#0 0x00007ffff7a8dffe in _IO_new_file_write (f=0x7ffff7dd4400 <_IO_2_1_stdout_>, data=0x7ffff7ff7000, n=5) at fileops.c:1261
#1 0x00007ffff7a8f4dc in new_do_write (to_do=5, data=0x7ffff7ff7000 "WORK\n", fp=0x7ffff7dd4400 <_IO_2_1_stdout_>) at fileops.c:538
#2 _IO_new_do_write ([email protected]=0x7ffff7dd4400 <_IO_2_1_stdout_>, data=0x7ffff7ff7000 "WORK\n", to_do=5) at fileops.c:511
#3 0x00007ffff7a8f8b3 in _IO_new_file_overflow (f=0x7ffff7dd4400 <_IO_2_1_stdout_>, ch=10) at fileops.c:876
#4 0x00007ffff7a84f72 in _IO_puts (str=0x4005d4 "WORK") at ioputs.c:42
#5 0x000000000040053b in main()
你是如何運行此程序? – ForceBru
用g ++編譯後我直接啓動它 –
那麼爲什麼heck是'main'多次運行?那是完整的代碼嗎? – ForceBru