我读到了外部变量,但没有找到与其内存分配相关的答案,我的问题是谁将为外部变量和内存段分配内存。
int a; // file 1
extern int a; // file 2
这里文件1将为一个或两个文件分配内存2.在数据段或堆栈中?
感谢。
答案 0 :(得分:7)
extern关键字的意思是“声明而不定义”。换句话说,它是一种显式声明变量或强制声明而没有定义的方法。
所以在file2
中,你刚刚声明了没有定义的变量(没有分配内存)。在file1
中,您声明并定义了类型为integer
的变量。在这里,您在BSS segment上分配了内存,因为您有未初始化的全局(对于C)。
在C ++中,全局变量存储在每进程数据区中。
声明和定义之间的区别:
要理解外部变量与extern关键字的关系,有必要了解定义和声明变量之间的区别。
当定义变量时,编译器为该变量分配内存,并可能还将其内容初始化为某个值。声明变量时,编译器要求在其他地方定义变量。
声明通知编译器存在该名称和类型的变量,但编译器不需要为它分配内存,因为它是在其他地方分配的。
答案 1 :(得分:5)
在文件2 中,声明了一个名为a
的整数类型变量(记住没有定义,即到目前为止a
没有内存分配)。我们可以根据需要多次进行此声明。
文件1 中的位置已声明和定义了名为a
的整数类型变量。 (记住,定义是超级声明集)。这里也分配了a
的内存。