如果我有这样的代码:
int e;
int* f;
int main() {
int a, b, c;
int* d;
}
这些变量存储在内存中的哪个位置? 而且,定义全局变量的问题是什么(在函数中,如本例中的main)?
答案 0 :(得分:9)
实际上并没有保证在内存中放置变量,只保证行为。
但在大多数(可能是所有)实际系统中,e
和f
将位于全局数据部分,而a
,b
,c
,d
混合使用寄存器和调用堆栈。 f
和d
都可以指向内存中的任何位置(好吧,对于MMU,这不完全正确,它们可以指向映射到进程中的内存子集中的任何位置)。
答案 1 :(得分:6)
a,b,c和d将存在于堆栈中。如果要创建一个int实例(使用malloc或new),那么它将在堆上运行 - 但是名为“d”的指针仍然存在于堆栈中。
e和f在应用程序的内存空间中分配空间,即所谓的“数据段” - 请参阅:
您还询问了堆栈大小:由编译器配置,请参见此处:
http://msdn.microsoft.com/en-us/library/tdkhxaks(VS.71).aspx
答案 2 :(得分:3)
为什么你认为这很重要?请注意,在现代C ++中,使用本地指针变量非常罕见。
在典型系统中,a,b,c和d将存在于堆栈中。但这是一个实现细节,语言标准没有具体说明。
答案 3 :(得分:3)
通常,a,b,c,d *将在程序堆栈上定义,尽管C ++ ISO标准没有指定应该定义变量的位置。
对于第二个问题,全局变量的问题是它们没有保护。对于一个依赖全局变量的简单脚本/应用程序可能没问题,但是在库和更复杂的代码中它会产生一个潜在的问题:任何代码都可以随时更改具有全局作用域的变量值,留下任何依赖于全局变量的代码一个不受欢迎的状态。
此外,由于变量属于全局范围,如果您使用定义具有相同名称的全局变量的任何其他代码,它们将对潜在的命名冲突开放。
答案 4 :(得分:1)
重点是变量的范围,它定义了它们的生命周期。主程序的变量将在程序期间可用。 main中的变量将在main()函数的持续时间内可用。
实际上,函数范围的变量通常在堆栈上分配,而全局变量在堆上分配,但这是一个实现细节。
全局变量的主要问题是控制访问,在多线程程序中很难处理它们。
编辑:正如@FredOverflow指出的那样,全局变量通常分配在加载可执行映像时设置的数据区中。