c++ - C语言程序小问题,本人小白刚学C
高洛峰
高洛峰 2017-04-17 15:26:21
0
2
393

代码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

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
Peter_Zhu

それだけです。
ローカル変数はスタック領域に格納され、スタックが操作されるたびに、スタックの先頭にあるポインタが移動され、関数の実行時に放棄されたスタックメモリをリセットする手間がかかりません。値がまだ存在します。ただし、関数ジャンプはスタック領域も使用するため、CPU が関数ジャンプを行うと一部のデータが変更されます。最初の数値は変化せず、その後は変化するのは、printf 関数を呼び出した際に発生するジャンプの際、最初の数値以降のスタック領域のみが使用されるためと考えられます。
構造内で特に大きな配列を定義し、同じ方法を使用して最初の構造内に情報を入力すると、当然のことながら、最初の構造内の配列の後半部分も変更されます。

いいねを押す +0
迷茫

上記の学生は明確に答えています。
ただし、より明確にするために、デバッグしてアドレス空間を確認することをお勧めします。その後、『コンピュータシステムを深く理解する』の第 1 章または第 2 章で詳しく説明します。一緒に見ればもう悩まない。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート