C语言中静态变量的内存分配
可能重复:C语言中静态变量的内存分配,c,C,可能重复: 我已经读到,所有初始化的全局变量将在初始化的数据段上分配空间,所有未初始化的静态和全局变量将初始化为0,并在BSS上分配空间。在以下定义的情况下 static int i = 0; 在哪里分配i的空间?它是因为i被初始化而在初始化的数据段上,还是因为i的值为0而在BSS上?这实际上取决于实际的编译器/实现,但是是的,i很可能在BSS上,因为它在文件级(即在任何函数之外)或者static在函数内部,并且具有0是的,未初始化的静态变量将默认初始化为0,这在C中总是正确的 数据的存储位
我已经读到,所有初始化的全局变量将在初始化的数据段上分配空间,所有未初始化的静态和全局变量将初始化为0,并在BSS上分配空间。在以下定义的情况下
static int i = 0;
在哪里分配
i
的空间?它是因为i
被初始化而在初始化的数据段上,还是因为i
的值为0而在BSS上?这实际上取决于实际的编译器/实现,但是是的,i
很可能在BSS上,因为它在文件级(即在任何函数之外)或者static
在函数内部,并且具有0
是的,未初始化的静态变量将默认初始化为0,这在C中总是正确的
数据的存储位置将取决于实现。。。我已经看到0个初始化的静态变量(I
在您的例子中)进入.BSS(以符号开头的块)
非0初始化静态进入。数据static int i=2代码>例如
要说明这一点:
int main(int argc, char * argv[])
{
return 0;
}
保存在“test.c”中
然后我们将其更新为:
int main(int argc, char * argv[])
{
static int i;
return 0;
}
> gcc test.c
> size a.out
text data bss dec hex filename
1056 252 12 1316 524 a.out
再次将其更改为:
int main(int argc, char * argv[])
{
static int i = 2;
return 0;
}
> gcc test.c
> size a.out
text data bss dec hex filename
1056 256 8 1316 524 a.out
编译此程序时,它取决于Linux和gcc 4.5.2的实现:
static int a[1000000] = {1}; void main() {}
我得到大小为3.9M的可执行文件-数组的第一个元素被初始化(使用非零值),所以数组“a”转到.data段
当我用零初始化数组时:
static int a[1000000] = {0}; void main() {}
我得到了大小为8.2K的可执行文件-我猜大小的差异表明这次“a”数组位于.bss段。看看这个:这是一个关于在某个特定平台上实际发生了什么、标准要求发生什么、可能发生什么的问题,或者什么?我想知道它会表现出什么样的行为,如果行为定义良好,需要发生什么。@Raj代码的行为定义良好。无论最终是数据段、BSS段还是其他完全不同的部分,都100%取决于平台和工具的特定组合。@Raj-请记住我的答案(如下),它取决于实现。。。但这对于Ubuntu/GCC来说是正确的。您可以使用类似的方法查看其他系统。我认为文件范围和功能范围都与存储无关。范围没有理由影响非自动变量的位置;仅在编译代码时管理作用域,以禁止生成超出作用域的内存访问。我同意,尽管它依赖于编译器。
static int a[1000000] = {0}; void main() {}