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
因为我只是复制粘贴代码,而实际上,我使用正确的方法.
这是对C FAQ的误读.
C FAQ解释了为什么代码不正确,但并没有说代码是保证崩溃的.以下是您引用的部分内容:
由于结构值函数通常通过添加隐藏的返回指针来实现...
我加重了.的C FAQ中解释了为什么代码可能会崩溃.两种情况下代码都不正确.(理论上,行为可以是实现定义的,但是您的C实现极不可能定义在这种情况下会发生什么.)
在许多系统(ABI)上,如果结构足够小,返回结构的函数将使用寄存器作为返回值.我不知道普通x64 ABI的限制是什么,但是两个单词(两个指针)相当小.
归档时间: |
|
查看次数: |
181 次 |
最近记录: |