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

代码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函数发生的跳转时,恰好只使用了从第一个数字之后栈空间。
如果你把你的结构体里面定义一个特别大的数组,然后用同样的方法把第一个结构体里的信息打出来,不出意外,第一个结构体里的数组的后半部分也会发生变化。

迷茫

上面的同学已经回答的很清楚了。
但是还是建议你去调试看地址空间,这样就比较清楚。然后《深入理解计算机系统》第一章还是第二章来着讲的更详细清楚。结合着看一下以后就不会困扰了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板