猿猿_yzg 2018-10-24 09:48 采纳率: 100%
浏览 492
已采纳

C语言栈相关,指针操作以及局部变量函数返回的相关问题

#include
void test2(int *l){
printf("l:%p,*l:%d\r\n",l,*l);
int mm[10]={1,2,3,4,5,6,7,8,9,10};
printf("mm:%p,l:%p,*l:%d\r\n",mm,l,*l);

int m=*l;
printf("m:%d\r\n",m);

}
void test(int a){
int b = 5;
*a = &b;
printf("a:%p,*a:%p,
a:%d\r\n",a,*a,**a);
}
int main(void){
int ptr2 = NULL;
test(&ptr2);

int mm[10]={1,2,3,4,5,6,7,8,9,0};

printf("m:%p,*m:%p,
*m:%d\r\n",&ptr2,ptr2,*ptr2);
test2(ptr2);
printf("m:%p,*m:%p,**m:%d\r\n",&ptr2,ptr2,*ptr2);
return 0;
}
问题1:test2函数中mm数组的元素个数少于10个的时候, printf("m:%d\r\n",m);的结果m是5
当超过10个元素的时候,printf("m:%d\r\n",m);的结果m是10,这是为什么?
问题2:这里边在test函数中b变量是局部变量,在test函数结束后局部变量b应该从栈中弹出了,为什么在test2中还可以访问到?推测原因是因为弹栈只是将栈顶指针移动了,b的地址上的值并没有清空,不知道这么想对不对?

  • 写回答

1条回答 默认 最新

  • threenewbee 2018-10-24 10:21
    关注

    你这样胡乱提问我也很无奈。你的代码都没有贴对,所以天知道你的代码是什么,假设是如下的代码

    #include<stdio.h>
    
    void test2(int *l){
    printf("l:%p,*l:%d\r\n",l,*l);
    int mm[10]={1,2,3,4,5,6,7,8,9,10};
    printf("mm:%p,l:%p,*l:%d\r\n",mm,l,*l);
    int m=*l;
    printf("m:%d\r\n",m);
    }
    void test(int** a){
    int b = 5;
    *a = &b;
    printf("a:%p,*a:%p,a:%d\r\n",a,*a,**a);
    }
    int main(void){
    int * ptr2 = NULL;
    test(&ptr2);
    
    int mm[10]={1,2,3,4,5,6,7,8,9,0};
    
    printf("m:%p,*m:%p,*m:%d\r\n",&ptr2,ptr2,*ptr2);
    test2(ptr2);
    printf("m:%p,*m:%p,**m:%d\r\n",&ptr2,ptr2,*ptr2);
    return 0;
    } 
    

    如果不是,那么你自己对照。

    问题1:这个应该是编译器相关的,在我这里,元素11的时候,还是输出5
    问题2:你说的对,除非新的数据放入堆栈,堆栈当然不会被清空

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题