我想知道未经初始化的数据在被修改后会在哪里存储?
例如,
所有在代码中初始化为某个值的变量都将存储在.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 回答
你在这里混淆了两件事 . 如果你说abouit
.bss
或.data
部分,你正在谈论本地(如你的例子)与全局/静态变量 .局部变量(如示例中所示)在堆栈上分配 . 没有涉及
.bss/.data
. 这些数据将是未经初始化的并且具有randome值,无论堆栈上的值是什么 .对于全局/静态未初始化变量,它们在程序启动时初始化为0 .
.bss包含 global 和 static 未初始化的变量 . 在您的示例中,数组将放在堆栈中 .
你的假设
不是真的 . 它未初始化,变量的内存已分配,但内容未初始化 .
不,只有未初始化的全局变量和静态变量才会初始化为0 .
在之前的回复中已经说过,在您的示例中,数字数组将存储在堆栈上,而不是存储在.bss部分,并且只有全局变量和静态变量将被初始化为0(如果它们是数字类型或对象为NULL)
以下示例显示了将存储不同变量的位置
还有很好的描述here
在您的示例中,数组在
stack
上声明 .因此没有任何事情继续
.bss