c - 为什么写作是主要的;在C中给出一个段错误

标签 c segmentation-fault

以下是我的 demo.c 文件:

main;

编译此 gcc 时会发出警告:

demo.c:1:1: warning: data definition has no type or storage class [enabled by default]

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

Segmentation fault (core dumped)

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

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

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

最佳答案

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

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

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

关于c - 为什么写作是主要的;在C中给出一个段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44480187/

相关文章:

c - 嵌套结构和 Typedef

c++ - dlopen 可能出现段错误的潜在原因?

c - 如何在 vb.net 中获取图像的句柄

代码第一次编译时给出正确的数字,第二次给出随机数

C/OpenCV 内存管理

c++ - 尝试访问超出范围的数组时出现段错误,原因不明

segmentation-fault - 为什么这个 Rust 程序不会崩溃?

c - 在正常情况下,未注册模式要求是否会阻止 Haskell 的基本 FFI 示例?

将 int 转换为 char 指针 : unexpected value?

c - binning/jack-knife c 程序中的段错误