我想知道未经初始化的数据在被修改后会在哪里存储?
例如,
在代码中初始化为某个值的所有变量都将存储在.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);
}
答案 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。