作者descent (「雄辩是银,沉默是金」)
看板C_and_CPP
标题Re: [问题] C语言return问题
时间Tue Jan 17 21:29:46 2017
我不确定对不对, x64 call convention 我不太熟,
你的程式码翻成组合语言是以下那样:
push %rbp
mov %rsp,%rbp
sub $0x10,%rsp
movl $0x5,-0x4(%rbp)
mov -0x4(%rbp),%eax
mov %eax,%edi
callq 4004e6 <sum>
mov %eax,%esi
mov $0x4005b4,%edi
mov $0x0,%eax
callq 4003e0 <printf@plt>
mov $0x0,%eax
call printf 时,
rdi 是 "%d" (mov $0x4005b4,%edi)
rsi 就是要印出的数字,
在这个组合语言上,
movl $0x5,-0x4(%rbp)
mov %eax,%edi
rsi 在这个时候得到 5,
所以 printf 才印出 5。
你可以试试把程式编成 32 bit 模式, 应该就不会是 5。
我的测试环境:
debian x64/gcc 5.4
※ 引述《pppty (无)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: Win10
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: GCC
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: 问题(Question):
: 单纯测试有设定return型态但是没有return值的状况
: 喂入的资料(Input):
: 无
: 预期的正确结果(Expected Output):
: compile不过
: 错误结果(Wrong Output):
: 印出传入的数值
: 程式码(Code):(请善用置底文网页, 记得排版)
: #include <stdio.h>
: int sum(int a){
: a+1;
: }
: int main(){
: int a = 5;
: printf("%d", sum(a));
: }
: 补充说明(Supplement):
: 以前初学C的时候因为没测试过这种状况
: 前两天碰到但是不知道原理
: 原本猜测会在编译时候出错 但是编译可以过 以及还能够印出值(5)
: 代表以前学到的概念错很大
: 想请问compiler是怎麽处理这个部分的呢?
: (以为compiler不会过但是过了,过了以为数值会是未知数却是5这样)
: 希望能有前辈能解惑 感谢
--
纸上得来终觉浅,绝知此事要躬行。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.204.64.97
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1484659793.A.9FA.html
※ 编辑: descent (180.204.64.97), 01/17/2017 21:31:14
1F:推 pppty: 感谢回覆 组语只碰过一点点 暂存器不熟 会找时间研究一下 01/18 23:30