c语言中结构体类型只有,C语言中main()函数不要返回结构体类型(求助)
大家先看一下這段程序:
#include
typedef unsigned char bool;
typedef struct _person person;
struct _person {
bool sex;
};
person main() {
person xingwang;
xingwang.sex = 0;
return xingwang;
}
如此簡(jiǎn)單清晰的程序,您覺得會(huì)報(bào)錯(cuò)嗎?如果您和我一樣,感覺肯定不會(huì)報(bào)錯(cuò),請(qǐng)繼續(xù)看這段程序編譯以后的匯編代碼:
.file "struct.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %eax
movb $0, -1(%ebp)
movzbl -1(%ebp), %edx
movb %dl, (%eax)
leave
ret $4
.size main, .-main
.ident "GCC: (GNU) 4.4.6 20110731 (Red Hat 4.4.6-3)"
.section .note.GNU-stack,"",@progbits
pushl %ebp 將當(dāng)前的基址存儲(chǔ),函數(shù)退出時(shí)用
movl %esp, %ebp 當(dāng)前函數(shù)的基址
subl $16, %esp 在棧中,分配16個(gè)字節(jié)來存儲(chǔ)局部的變量
movl 8(%ebp), %eax 調(diào)用main()函數(shù)的地方,返回值會(huì)存儲(chǔ)在這里。(很顯然,沒有函數(shù)調(diào)用main(),這個(gè)地址很不確定)
movb $0, -1(%ebp) 為xingwang.sex賦值
movzbl -1(%ebp), $edx
movb %dl, (%eax) 將xingwang賦值給eax指向的內(nèi)存地址
問題就出在 movl 8(%ebp), %eax 這一行。使用GDB調(diào)試以后發(fā)現(xiàn),%ebp+8這個(gè)位置的值是 0x1,也就是說函數(shù)最后的返回值要存儲(chǔ)給0x1這個(gè)內(nèi)存單元。很顯然這個(gè)內(nèi)存單元不是用戶可以操作的。
原因是,根據(jù)ABI,當(dāng)返回值為結(jié)構(gòu)體類型時(shí),返回值就存儲(chǔ)在棧中。
所以,這個(gè)C程序最后運(yùn)行時(shí),會(huì)提示 段錯(cuò)誤 或者 Segment Fault。
研究了好幾天,也沒研究出什么眉目,好像根據(jù)什么 calling conventions 和?ABI,有個(gè)約定,某些時(shí)候會(huì)把返回值存儲(chǔ)在寄存器里,某些時(shí)候會(huì)存儲(chǔ)在調(diào)用函數(shù)的棧中。有哪位大俠知道的,給指?jìng)€(gè)路……多謝了!
總結(jié)
以上是生活随笔為你收集整理的c语言中结构体类型只有,C语言中main()函数不要返回结构体类型(求助)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 群晖服务器性能测试,对群晖DS716+进
- 下一篇: android安全性发展,Android