猿猿_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 用verilog实现tanh函数和softplus函数
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题