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

Del*_*lla 3 c c++ scope memory-management global-variables

举个例子.

#include "stdio.h"

int global_var=5;

int main ()
{
    int local_var=6;
    //some statements

    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

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

在相关的说明中,是global_var在堆还是堆栈中分配?另外,有没有办法从函数声明一个全局变量,同时尊重入口点?

Bat*_*eba 7

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

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

因此global_var 可以在堆上分配,但它可能main输入之前设置的某种堆栈上.

在函数中无法声明全局变量.static函数中的变量可以模仿全局变量的大部分行为,但从概念上讲,它static是在第一次遇到函数时初始化的.