C语言普通函数的返回值问题

ZeaLot4J 2017-12-15 03:57:01
闲来无事,在segmentfault上看到一篇用C理解FP中的functor,monad的文章,挺有意思的,地址在这https://segmentfault.com/a/1190000012435966,不过我的问题和FP没半毛钱关系,就是下面这段

#include <stdio.h>
#include <stdlib.h>
#define Nothing NULL
typedef struct {
void* thing;
} Maybe;

Maybe foo(void *thing) {
return (Maybe){.thing = thing};
}
Maybe testa(void* thing) {
(*(int*)thing) += 30;
}
Maybe testb(void* thing) {
(*(int*)thing) -= 20;
}
Maybe testc(void* thing) {
(*(int*)thing) *= 10;
}

int main() {
int a = 10;
Maybe x = foo(&a);
Maybe y = testa(x.thing);
printf("%d\n", *((int*)y.thing));
return 0;
}

三个test没有返回值,这为什么编译不报错,而且运行还能得到正确答案,我怀疑我3年前学了假的C语言。。。
我编译器版本为gcc version 5.1.0 (tdm64-1),不知道有没有朋友知道怎么回事,只要愿意回答,通通感激不尽。
...全文
137 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZeaLot4J 2017-12-15
  • 打赏
  • 举报
回复
引用 1 楼 jiht594 的回复:
和你一样gcc5.1.0 32位的、 有3警告 warning: control reaches end of non-void function [-Wreturn-type]|
虽然没解决我的问题,但是不管怎样还是要感谢你愿意回答。
ZeaLot4J 2017-12-15
  • 打赏
  • 举报
回复
引用 2 楼 paschen 的回复:
没返回值实际返回的是EAX寄存器之前存在的值
明白了,之前EAX里存放的就是调用foo函数之后产生的结果x。C的汇编源码没怎么看过。感谢哈。
paschen 2017-12-15
  • 打赏
  • 举报
回复
没返回值实际返回的是EAX寄存器之前存在的值
jiht594 2017-12-15
  • 打赏
  • 举报
回复
和你一样gcc5.1.0 32位的、 有3警告 warning: control reaches end of non-void function [-Wreturn-type]|

69,378

社区成员

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

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