2012-07-02 149 views
0

为什么以下程序不打印垃圾值。据我所知,数组分配的内存(即在编译时)和堆栈内存包含一些垃圾值。但它不打印垃圾值。它是打印1的。只有在函数g()中,数组b的大小b>数组a的大小时,它才会打印垃圾值。当数组的大小在g()>数组a的大小时,它将打印12个1(在这种情况下)并作为垃圾值休息。不打印垃圾值

void f() 
    { 
     int a[12],i=0; 
     for(i=0;i<12;i++) 
      a[i]=1; 
    } 
    void g() 
    { 
     int b[12],i=0; 
     for(i=0;i<12;i++) 
      printf("%d\n",b[i]); 
    } 
    int main() 
    { 
     f(); 
     g(); 
      return 0; 
    } 

分配给数组b的内存是否与先前分配给数组a的内存相同?

回答

5

它是垃圾,由功能f()留下 - 这种效果没有定义。该效果是编译器如何在堆栈中分配和取消分配局部变量的副产品。

当函数返回时,编译器可以产生完全用随机数据覆盖堆栈的代码,或者它可以产生代码来修改堆栈指针,这就是它在这种情况下所做的。