在C中声明全局变量会改变入口点吗?

Does Declaring a Global Variable in C Alter the Entry Point?

本文关键字:入口 改变 声明 全局变量      更新时间:2023-10-16

看这个例子。

#include "stdio.h"
int global_var=5;
int main ()
{
    int local_var=6;
    //some statements
    return 0; 
}

如果main函数是唯一的入口点,那么global_var的声明和赋值在什么时候发生?

在一个相关的注意事项上,global_var是分配在堆中还是堆栈中?此外,是否有一种方法来声明一个全局变量从一个函数,而尊重入口点?

概念上,全局变量的初始化发生在 main输入之前。在这里,我假设所有代码都在一个翻译单元中编译:更正式地说,在遇到定义该全局变量的翻译单元中定义的任何函数之前,立即初始化全局变量。(尽管编译器可以优化这个,如果没有副作用的话)。

C和c++在它们的标准中都没有提到堆或堆栈:它们是实现概念,而不是语言概念。

所以global_var 可以被分配到堆上,但是它可能是在main进入之前建立的某种堆栈上。

不能在函数中声明全局变量。函数中的static变量可以模仿全局变量的许多行为,但从概念上讲,static是在函数第一次遇到时初始化的。

全局变量在进入main之前进行初始化。

不能在任何函数中声明全局变量。如果在函数内声明任何变量,那么该变量的作用域将仅限于该函数。代替全局变量,您可以尝试通过使用static变量来实现您的目标。

全局变量既不存储在堆栈中,也不存储在堆中。每个程序(可执行代码)通常分为四个部分。

Code
Data
Stack
Heap

全局变量和常量/字面值一起存储在Data节中。源:变量存储在内存的哪里?

p。S: static变量只能初始化一次