首页 文章

C中未初始化数据的位置

提问于
浏览
1

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

例如,

所有在代码中初始化为某个值的变量都将存储在.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

    你在这里混淆了两件事 . 如果你说abouit .bss.data 部分,你正在谈论本地(如你的例子)与全局/静态变量 .

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

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

  • 0

    .bss包含 globalstatic 未初始化的变量 . 在您的示例中,数组将放在堆栈中 .

  • 1

    你的假设

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

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

  • 2

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

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

  • 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

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

    因此没有任何事情继续 .bss

相关问题