在C中声明全局变量会改变入口点吗?
Does Declaring a Global Variable in C Alter the Entry Point?
看这个例子。
#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
变量只能初始化一次
相关文章:
- 变量没有改变?通过向量的函数调用
- 如何改变c++应用程序的视觉效果
- C++在不同线程中改变向量
- 如何访问和改变存储在矢量C++中的对象
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 为什么 c++ 动态数组的大小没有改变?
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 在向量内更改变量的值不会改变其在向量外的值
- 修改程序的入口点时未调用全局变量的构造函数
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 改变或缩放两个正态分布以具有特定的相关系数
- 当我使用CHAR_INFO结构时,控制台会无缘无故地改变颜色
- 为什么我的函数接受"std::string"进行排序不会改变它?
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- 使用可变参数模板改变模板参数
- C++中物体改变识别的设计模式?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 在C中声明全局变量会改变入口点吗?