请问 全局变量赋初值是在什么阶段

qq_38061756 2017-09-19 03:54:01
我所理解的全局变量是存储在静态存储区中,用户在定义时可以赋初值,如果不赋初值默认为0。
但是我在网上看到很多人说,全局变量的赋值是在编译时进行的。如果这样说编译一个可执行程序,重复运行main函数,全局变量只会赋一次初值,因为没有再重新编译过。这样如果main函数中对全局变量进行++操作,则运行几次main函数,全局变量应该就会加几次,但是通过测试并非如此。在linux上gcc编译一次,运行多次main函数,每次输出的a和&a都是相同的,a为2。难道全局变量的初始化赋值是在每次运行可执行文件之前都会重新赋值,而不是编译阶段吗?求大佬解释

#include "stdio.h"
int a=1;
int main()
{
a++;
printf("%d\n",a);
printf("%x\n",&a);
return 0;
}

...全文
1007 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-09-20
  • 打赏
  • 举报
回复
操作系统加载exe时。
自信男孩 2017-09-19
  • 打赏
  • 举报
回复
程序退出后,程序里所申请的空间,不论是栈上的,堆上的,还是数据段上的都会被释放。这个我们看不到,是系统负责处理的。 所以,再次运行时,就会重新申请,重新赋值等等。 所以每次执行都是一样的
lzlliuzunli 2017-09-19
  • 打赏
  • 举报
回复
你多次运行你main函数,main对全局变量的改变会保存下来吗?每次运行main之前才分配赋值吧
jena_wy 2017-09-19
  • 打赏
  • 举报
回复
全局变量在main之前就申请好的。
  • 打赏
  • 举报
回复 1
程序加载的时候,进入Main之前。 如果你会C++,可以在C++里自定义一个类,然后在类的构造函数中打印一个信息。 用这个类,定义一个全局变量。 看什么时候打印出构造函数信息,就是什么时候执行的。 下面的代码供参考:

#include <iostream>
using namespace std;

class abc
{
public:
	abc();
	~abc();

private:

};

abc::abc()
{
	cout << "abc Init" << endl;
}

abc::~abc()
{
	cout << "abc destroy" << endl;
}

abc a;
int main() {
	cout << "main" << endl;
	return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧