为什么写主要;在C中给出一个段错误

时间:2017-06-11 03:45:26

标签: c segmentation-fault

以下是我的demo.c文件:

main;

编译此gcc时会发出警告:

  

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

运行./a.out会产生分段错误:

  

分段错误(核心转储)

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

在任何一种情况下,我仍然不明白为什么它应该抛出一个段错误。

更新:它可能看起来与http://kyoukai.readthedocs.io/en/latest/类似,但这是不同的,因为不使用任何标识符,编译代码。

1 个答案:

答案 0 :(得分:5)

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

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

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