gpt4 book ai didi

c++ - 程序执行不是从 main() 开始的

转载 作者:可可西里 更新时间:2023-11-01 18:18:40 25 4
gpt4 key购买 nike

我用 C 开发了很多年,直到现在才发现程序可以在 main() 函数之前执行代码。这是一个代码示例

int generateNum(){
// Some malicious code here...
return 5;
}

static int someArray[] = {generateNum(),generateNum()}

int main(){
// Some code here...
}

函数 generateNum()main() 之前被调用了两次。

我的问题是

  1. 谁调用了 generateNum()?我知道在 Windows 上是 crtexe()
  2. 这种行为在不同平台上是否标准化:Windows/Linux/Android/iOS?
  3. 如何获得有关此行为的更多信息?我想在谷歌中搜索,但我不知道如何描述它。
  4. 我可以在 generateNum() 中做任何我想做的事吗?我的意思是,我可以调用 malloc() 吗? fopen() 和 fwrite() 怎么样?我可以打开套接字并通过 UDP 发送信息吗?最终我可以滥用这个函数,甚至可以从它调用 main() :-)

最佳答案

  1. C++ 保证此类初始化发生在main 之前。这可以由操作系统加载器/链接器或一些链接到包含 main 的目标文件的特殊模块来处理。对于 gcc,这在此处进行了描述:http://gcc.gnu.org/onlinedocs/gccint/Initialization.html
  2. 不完全是。 C++11, 3.6.2.4 (basic.start.init):是否在 main 的第一条语句之前完成具有静态存储持续时间的非局部变量的动态初始化是实现定义的。 请注意,初始化发生在您可以访问该值之前,尤其是在对同一编译单元中的实体有任何引用概念之前。
  3. 语言标准中的[basic.start.init]就是你要看的。这里的行为是对具有静态存储持续时间的变量进行动态初始化

关于c++ - 程序执行不是从 main() 开始的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20218690/

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