为啥写作主要;在 C 中给出一个段错误

Posted

技术标签:

【中文标题】为啥写作主要;在 C 中给出一个段错误【英文标题】:Why does writing main; in C give a segfault为什么写作主要;在 C 中给出一个段错误 【发布时间】:2017-11-12 19:02:42 【问题描述】:

以下是我的demo.c文件:

main;

在编译这个 gcc 时会给出警告:

demo.c:1:1: 警告:数据定义没有类型或存储类 [默认启用]

运行 ./a.out 会出现分段错误:

分段错误(核心转储)

是不是因为,(1) main 没有在任何地方定义,我们正在尝试执行它;(2) 我们在任何函数之外使用了命令式语句,所以它无法执行。

无论哪种情况,我仍然不明白为什么它应该抛出一个段错误。

更新:它可能看起来类似于 Is ‘int main;’ a valid C/C++ program?,但这是不同的,因为它不使用任何标识符来编译代码。

【问题讨论】:

Is ‘int main;’ a valid C/C++ program?的可能重复 我的错。感谢您指出。 【参考方案1】:

您的代码在标准 C 中正式非法(通常是“不可编译的”)。您收到的诊断信息旨在准确地告诉您这一点。

但是,您的编译器显然接受了它并将其解释为某种特定于实现的方式。显然,它将main 解释为具有外部链接的int 变量的定义(旧版K&R C 特定行为)。它创建了一个导出单个外部符号main 的目标文件(可能以某些特定于实现的方式被破坏)。后来链接器将main 注册为程序的入口点。

当您尝试运行您的可执行文件时,加载程序将控制权传递给该main 变量的位置,错误地认为这是程序的入口点。程序崩溃,因为该位置没有有效的可执行代码。或者,更有可能是数据执行阻止导致程序崩溃。

【讨论】:

明白。非常感谢! :) 链接器是非常简单的程序。 C++ 类型安全链接有很大帮助——但 C++ 链接器不再是头脑简单的了。

以上是关于为啥写作主要;在 C 中给出一个段错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 c 中遇到 atoi 的段错误?

C++ 为啥在向量段错误中放置对象?

C++ unordered_map emplace() 函数抛出段错误,我不知道为啥

为啥这段代码在 64 位架构上会出现段错误,但在 32 位上却能正常工作?

返回 malloc 的结构会给出段错误和不同的地址

在类对象段错误中使用 boost::interprocess,为啥?