C语言子程序定义了返回类型,未return,为何能返回值

smy14520 2014-04-21 09:22:29
#include "stdio.h"
void main()
{
float a[]={1,2,3,4,5,6};
float b;
unsigned length=6;
b=sum(a,length);
printf("数值%f",b);

}
float sum(float a[],unsigned length)
{

int i;
float result =0;
for(i=0;i<=length-1;i++)
{
printf("%d",i);
}
}


这个程序, 我没有写return 返回值,可是编译运行后居然返回了值 6
这是为什么。 反汇编进入CALL后 发现:

004010B0 > 55 push ebp
004010B1 8BEC mov ebp, esp
004010B3 83EC 48 sub esp, 48
004010B6 53 push ebx
004010B7 56 push esi
004010B8 57 push edi
004010B9 C745 F8 0000000>mov dword ptr [ebp-8], 0
004010C0 C745 FC 0000000>mov dword ptr [ebp-4], 0
004010C7 EB 09 jmp short 004010D2 //循环开始
004010C9 8B45 FC mov eax, dword ptr [ebp-4] // 取出i的值
004010CC 83C0 01 add eax, 1 //eax累加 循环结束后 是6
004010CF 8945 FC mov dword ptr [ebp-4], eax
004010D2 8B4D 0C mov ecx, dword ptr [ebp+C]
004010D5 83E9 01 sub ecx, 1
004010D8 394D FC cmp dword ptr [ebp-4], ecx
004010DB 77 13 ja short 004010F0 //循环结束 跳出循环
004010DD 8B55 FC mov edx, dword ptr [ebp-4]
004010E0 52 push edx
004010E1 68 24404200 push 00424024 ; ASCII "%d"
004010E6 E8 25000000 call printf
004010EB 83C4 08 add esp, 8
004010EE ^ EB D9 jmp short 004010C9

有点乱。然后回到主程序 EAX被当做返回值 也就是6, 我想知道这是编译器的有意为之?还是纯粹是个巧合?
...全文
372 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aist-memory 2014-04-22
  • 打赏
  • 举报
回复
读了函数名指向内存
FrankHB1989 2014-04-22
  • 打赏
  • 举报
回复
在你没找到编译器明确遵循的ABI前只能当成是运气。 不管怎么说从C的角度上这样写就是错的。
derekrose 2014-04-21
  • 打赏
  • 举报
回复
不要盲目相信编译器 因为编译器也是人写的
temperlancer 2014-04-21
  • 打赏
  • 举报
回复 1
EAX被默认为存储着返回值的Register.
fly 100% 2014-04-21
  • 打赏
  • 举报
回复
只是声明了void 只好还是看编译器

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧