我刚遇到的一些旧代码:

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/

10-12 16:12