gpt4 book ai didi

c - 为什么 const int main = 195 导致一个工作程序但没有 const 它以段错误结束?

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

考虑以下 C 程序(参见现场演示 here)。

const int main = 195;

我知道在现实世界中没有程序员会这样写代码,因为它没有任何用处,也没有任何意义。但是,当我从程序上方删除 const 关键字时,它会立即导致 segmentation fault。 .为什么?我很想知道这背后的原因。

GCC 4.8.2 在编译时给出以下警告。

warning: 'main' is usually a function [-Wmain]

const int main = 195;
^

为什么 const 关键字的存在与否会影响程序的行为?

最佳答案

观察值 195 如何对应于 8086 兼容机上的 ret(从函数返回)指令。因此,main 的定义在执行时就像您将其定义为 int main() {} 一样。

在某些平台上,const 数据被加载到可执行但不可写的内存区域,而可变数据(即未限定 const 的数据)被加载到可写但不可写的内存区域可执行内存区域。出于这个原因,当您将 main 声明为 const 时,该程序会“运行”,但当您不使用 const 限定符时,该程序将“运行”。

传统上,二进制文件包含三个片段:

  • text 段是(如果架构支持的话)写保护和可执行的,并且包含可执行代码、static 存储持续时间限定的变量 const 和字符串文字
  • data 段是可写的,不能执行。它包含未限定 const 且具有static 存储持续时间的变量和(在运行时)具有已分配 存储持续时间的对象
  • bss 段与data 段类似,但初始化为全零。它包含 static 存储持续时间未限定 const 的变量,这些变量已在没有初始化程序的情况下声明
  • 二进制文件中不存在堆栈段,并且包含具有自动存储持续时间的变量

从变量 main 中删除 const 限定符会导致它从 text 移动到 data段,它是不可执行的,导致您观察到的分段违规。

现代平台通常有更多的段(例如 rodata 段用于既不可写也不可执行的数据)所以请不要在未查阅平台特定文档的情况下将其视为对您平台的准确描述.

请理解,不让 main 成为一个函数通常是不正确的,尽管从技术上讲,一个平台可以允许 main 被声明为一个变量,cf. ISO 9899:2011 §5.1.2.2.1 ¶1,强调我的:

1 The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters (...) or with two parameters (...) or equivalent; or in some other implementation-defined manner.

关于c - 为什么 const int main = 195 导致一个工作程序但没有 const 它以段错误结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33305574/

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