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);
    }
4

6 回答 6

4

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

于 2013-07-25T06:53:49.290 回答
2

你在这里混淆了两件事。如果您谈论 abouit.bss.datasection,您正在谈论本地(如您的示例)与全局/静态变量。

如您的示例所示,局部变量是在堆栈上分配的。没有.bss/.data涉及。该数据将未初始化并具有随机值,无论堆栈上的值是什么。

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

于 2013-07-25T06:55:48.153 回答
1

你的假设

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

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

于 2013-07-25T06:50:39.187 回答
1

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

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

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

}

这里也有很好的描述

于 2013-07-25T07:10:43.837 回答
0

在您的示例中,数组是在stack.

因此没有任何事情发生.bss

于 2013-07-25T06:53:52.177 回答
0

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

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

于 2013-07-25T06:55:24.417 回答