Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中静态变量的内存分配_C - Fatal编程技术网

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() {}