搜尋

首頁  >  問答  >  主體

c++ - C语言程序小问题,本人小白刚学C

代码1:当a是变量时

#include<stdio.h>

int * ccc();

int main(void)

{
    int* p = ccc();
    
    printf("%d\n",*p);
    printf("%d\n",*p);
    printf("%d\n",*p);
    printf("%d\n",*p);
    printf("%d\n",*p);
    return 0;
}

int * ccc()

{
    int a = 5;
    
    return &a;

}

运行结果:

代码2:当变量时数组时

#include<stdio.h>

int * ccc();

int main(void)

{
    int i;
    int* p = ccc();
    
    for(i = 0;i <= 5;i++)
    {
        printf("%d ",*(p + i));
    }
    return 0;
}

int * ccc()

{
    int a[6] = {1,2,3,4,5,6};
    int * p = a;
    
    return p;

}

运行结果:

小白疑问
1.为什么运行结果会是这样的?为啥局部变量a被释放了第一次还能正常访问,而且为什么只有第一次能正常访问呢,空间不是都被释放了吗?变量为数组是为啥运行结果是这样的?好奇怪,我想知道具体的原理

谢谢各位大神了哈O(∩_∩)O

高洛峰高洛峰2772 天前395

全部回覆(2)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 15:28:21

    是這樣的。
    局部變數儲存在堆疊區,而每次對堆疊進行操作的時候只是移動棧頂的指針,而不會費時費力去對被廢棄的棧內存進行復位,也就是說,函數返回時,數值還存在那裡。但是,函數的跳躍也會使用堆疊空間,所以部分資料會在CPU作函數跳轉時改變。之所以第一個數不會變而之後會變,估計是因為在呼叫printf函數發生的跳轉時,恰好只使用了從第一個數字之後棧空間。
    如果你把你的結構體裡面定義一個特別大的數組,然後用同樣的方法把第一個結構體裡的信息打出來,不出意外,第一個結構體裡的數組的後半部分也會改變。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 15:28:21

    上面的同學已經回答的很清楚了。
    但是還是建議你去調試看地址空間,這樣就比較清楚。然後《深入理解電腦系統》第一章還是第二章來著講的更詳細清楚。結合著看一下以後就不會困擾了。

    回覆
    0
  • 取消回覆