我刚遇到的一些旧代码:
MLIST * new_mlist_link()
{
MLIST *new_link = (MLIST * ) malloc(sizeof(MLIST));
new_link->next = NULL;
new_link->mapi = NULL;
new_link->result = 0;
}
调用它是为了建立链接列表,但是我注意到没有声明:
return new_link;
即使没有return语句,该列表仍然可以正确构建。为什么会这样呢?
编辑:平台:Mandriva 2009 64位Linux 2.6.24.7-服务器GCC 4.2.3-6mnb1
编辑:有趣的...该代码还在大约5种不同的Linux安装,所有不同的版本/版本以及Mac上成功运行。
最佳答案
在大多数情况下,在32位Windows上,函数的返回值保留在EAX寄存器中。尽管其他特定于编译器的操作系统也使用了类似的设置。该特定函数可能将new_link变量存储在相同的位置,因此当您不返回任何内容而返回时,调用者将该位置中的变量视为返回值。
这是不可移植的,而且实际上非常危险,但这也是使C语言编程变得如此有趣的小事情之一。
关于c - 为什么此代码仍然有效?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2776493/