猿猿_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:你说的对,除非新的数据放入堆栈,堆栈当然不会被清空

    图片说明

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

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码