C中未初始化数据的位置

时间:2013-07-25 06:46:37

标签: c

我想知道未经初始化的数据在被修改后会在哪里存储?

例如,

在代码中初始化为某个值的所有变量都将存储在.data部分中。

所有未初始化的变量将由编译器初始化为0并存储在.bss部分中。

现在,让我们说,我在代码中定义了一个包含10个整数的数组。但是我没有指定这个数组的元素。因此,数组的所有整数将由编译器初始化为0,并且.bss部分中将保留40个字节。

在此之后,我将一些数据写入数组,是否会修改.bss部分本身的数据?

#include <stdio.h>
#include <math.h>

int main(int argc, char **argv)
{
    int i;

    /* 10 integers are initialized to 0 and stored in the .bss section */

    unsigned int numbers[10];

    /* write data to array */

    for(i=0;i<10;i++)
    {
        numbers[i]=pow(2,i);
    }

6 个答案:

答案 0 :(得分:4)

.bss包含全局静态未初始化的变量。在您的示例中,数组将放在堆栈上。

答案 1 :(得分:2)

你在这里混淆了两件事。如果您在谈论本地(如您的示例)与全局/静态变量之间的.bss.data部分。

在您的示例中,局部变量在堆栈上分配。没有涉及.bss/.data。这些数据将是未经资本化的,并且具有randome值,无论堆栈上的值是什么。

对于全局/静态未初始化变量,它们在程序启动时初始化为0.

答案 2 :(得分:1)

你的假设

  

“所有未初始化的变量都将初始化为0   由编译器“

不是真的。它是未初始化的,变量的内存已分配,但内容未初始化。

答案 3 :(得分:1)

在之前的回复中已经说过,在你的例子中,数字数组将存储在堆栈而不是.bss部分,只有全局和静态变量将被初始化为0(如果它们是数字类型或NULL为对象

以下示例显示了存储不同变量的位置

int abc = 1;                            ---->   Initialized Read-Write Data
char *str;                              ---->   BSS
const int i = 10;                       ----->  Initialized Read-Only Data

main()
{
    int ii,a=1,b=2,c;                   ----->  Local Variables on Stack

    char *ptr;
    ptr = malloc(4);                     ------> Allocated Memory in Heap

     c= a+b;                             ------> Text

}

还有很好的描述here

答案 4 :(得分:0)

在您的示例中,数组在stack上声明。

因此.bss

没有任何内容

答案 5 :(得分:0)

  

所有未初始化的变量将由编译器初始化为0并存储在.bss部分中。

不,只有未初始化的全局变量和静态变量才会初始化为0。