歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C語言中main()函數中不要有return語句

大家先看一下這段程序:

  1. #include <stdio.h>   
  2.   
  3. typedef unsigned char bool;  
  4. typedef struct _person person;  
  5.   
  6. struct _person {  
  7.     bool sex;  
  8. };  
  9.   
  10. person main() {  
  11.   
  12.     person xingwang;  
  13.     xingwang.sex = 0;  
  14.   
  15.     return xingwang;  
  16. }  
如此簡單清晰的程序,您覺得會報錯嗎?如果您和我一樣,感覺肯定不會報錯,請繼續看這段程序編譯以後的匯編代碼:
  1.     .file   "struct.c"  
  2.     .text  
  3. .globl main  
  4.     .type   main, @function  
  5. main:  
  6.     pushl   %ebp  
  7.     movl    %esp, %ebp  
  8.     subl    $16, %esp  
  9.     movl    8(%ebp), %eax  
  10.     movb    $0, -1(%ebp)  
  11.     movzbl  -1(%ebp), %edx  
  12.     movb    %dl, (%eax)  
  13.     leave  
  14.     ret $4  
  15.     .size   main, .-main  
  16.     .ident  "GCC: (GNU) 4.4.6 20110731 (Red Hat 4.4.6-3)"  
  17.     .section    .note.GNU-stack,"",@progbits  

pushl %ebp 將當前的基址存儲,函數退出時用

movl %esp, %ebp 當前函數的基址

subl $16, %esp 在棧中,分配16個字節來存儲局部的變量

movl 8(%ebp), %eax 調用main()函數的地方,返回值會存儲在這裡。(很顯然,沒有函數調用main(),這個地址很不確定)

movb $0, -1(%ebp) 為xingwang.sex賦值

movzbl -1(%ebp), $edx

movb %dl, (%eax) 將xingwang賦值給eax指向的內存地址

問題就出在 movl 8(%ebp), %eax 這一行。使用GDB調試以後發現,%ebp+8這個位置的值是 0x1,也就是說函數最後的返回值要存儲給0x1這個內存單元。很顯然這個內存單元不是用戶可以操作的。

所以,這個C程序最後運行時,會提示 段錯誤 或者 Segment Fault。

Copyright © Linux教程網 All Rights Reserved