变量/数组的行为

时间:2015-03-16 11:09:41

标签: c arrays storage

我有两个程序:

program 1:    
----------
#include<stdio.h>
int main()
{
    int a[10];
    return 0;
}

program 2:
----------
#include<stdio.h>
int a[10];
int main()
{
   return 0;

}

1)两个程序都可以为数组 a [10] 分配内存 2)如果两个程序都在分配内存中完成,其中内存段(我的意思是数据段或堆栈段)是分配的内存。
3)任何人都可以解释程序1和程序2之间的区别吗?

2 个答案:

答案 0 :(得分:4)

计划1:

  • 数组在堆栈上分配
  • 因为它在堆栈上而未初始化,它将包含堆栈中的任何内容;我们称之为垃圾。

计划2:

  • 该数组是一个全局数组,并在.data数据部分中分配(除非在链接器文件中另有指定)
  • 它实际上是.bss部分,它是.data(通常)的一部分。这是所有未初始化的全局变量最终的结果。
  • 会自动初始化为0.

答案 1 :(得分:0)

  1. 是的!这两个程序都会为数组a []。
  2. 分配内存
  3. 共有4个部分 - (Global seg + Constant seg)=(数据部分)
    在全局声明中,它位于全局数据部分。而本地的一个是在Stack段中,因为一个函数实例化将一个帧推入到堆栈中,其中包含变量,...等状态信息,并从函数调用函数的返回点开始。

    + --------- +
    |堆栈.. | + --------- +
    |堆...... | + --------- +
    |全局|
    + --------- +
    |常量... |
    + --------- +
    |代码... |
    + --------- +

  4. 现在在第一种情况下,它位于Stack段中。在Globals记忆段中的第二种情况 堆栈段的数组具有其功能体的范围。在函数存活之前它将一直存在。 但是,全球一个将继续存在,直到该计划结束。现在这里函数是main(),然后这两个将具有相同的生命周期。

    global int变量的初始值为0.但是本地变量将包含垃圾值(除非已初始化)。