gpt4 book ai didi

c - 最短的C程序,仍然会导致段错误

转载 作者:太空狗 更新时间:2023-10-29 16:22:52 25 4
gpt4 key购买 nike

有那么一刻,我为自己编写了我的第一个没有错误的 C 程序而感到非常自豪。这是完整的源代码:

int main;

即使没有 int 也能完美编译,但会发出警告(即使没有 -Wall),作为一个以无错误程序为目标的程序员,我将它们视为错误。

愉快地编译了这个应用程序后,我立即冲上去启动它。令我惊讶的是,出现了段错误...


现在说真的。 究竟发生了什么?

我的猜测是:缺少main的定义。这很明显,但编译器允许这样做。好的,main 可以在不同的单元中定义。但即使是链接器也不会对此做任何事情。有什么特别的原因吗?

最佳答案

单词main 是任何变量的合法名称。典型的用例是向编译器提供名称为 main 的函数,编译器将其编译为目标文件,该文件又与 crt0.o 链接为运行时(堆栈分配等)提供初始化并跳转到标签 main

在 C 目标文件中,符号与原型(prototype)没有关联,链接器成功链接了一个全局变量 int main; 作为要跳转到的主程序。然而,这个程序是垃圾。它很可能初始化为零,但很快处理器就会遇到随机指令访问程序分配的数据空间(堆栈 + 堆)之外的内存,或者指令流达到保留代码空间的限制。

两者都会导致段错误。实际上,如果系统在带有执行标志 的体系结构上运行,则程序会在第一次尝试跳转到数据 段或没有执行权限的页面时发生段错误。

进一步阅读以支持评论中的讨论:Data Execute Prevention , NX_bit

关于c - 最短的C程序,仍然会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15333215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com