程序不应该按照"C faq"工作,但它有效

Ash*_*uja -4 c coredump

c-faq当我遇到这个页面时,我正在经历这个问题.我说以下程序将有一个核心转储:

struct list {
    char *item;
    struct list *next;
}

/* Here is the main program. */

main(argc, argv)
{}
Run Code Online (Sandbox Code Playgroud)

他们告诉核心转储发生的原因是:

结构声明结尾处缺少分号会导致main被声明为返回结构.(由于介入的注释,很难看到连接.)由于结构值函数通常是通过添加隐藏的返回指针来实现的(参见问题2.9),所以生成的main()代码尝试接受三个参数,尽管只有两个传递(在这种情况下,通过C启动代码).另见问题10.9和16.4.

虽然,当我跑这个节目在网上在这里,它的工作完美,程序也运行到最后.另外,当我使用gcc编译这个程序时,我没有收到任何警告.

我很惊讶,因为程序应该没有运行到最后.有人能告诉我为什么这个程序有效吗?如果它是正确的,为什么提到该程序将无法工作(任何可能崩溃的机会?).

注意:请不要发表评论如使用,int main因为我只是复制粘贴代码,而实际上,我使用正确的方法.

Die*_*Epp 9

这是对C FAQ的误读.

C FAQ解释了为什么代码不正确,但并没有说代码是保证崩溃的.以下是您引用的部分内容:

由于结构值函数通常通过添加隐藏的返回指针实现...

我加重了.的C FAQ中解释了为什么代码可能会崩溃.两种情况下代码都不正确.(理论上,行为可以是实现定义的,但是您的C实现极不可能定义在这种情况下会发生什么.)

在许多系统(ABI)上,如果结构足够小,返回结构的函数将使用寄存器作为返回值.我不知道普通x64 ABI的限制是什么,但是两个单词(两个指针)相当小.

  • @AshishAhuja是的,这是*问题*.答案在于*answer*部分(由该页面上的"A:"引入). (2认同)