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

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条回答 默认 最新

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

    图片说明

    点赞 打赏 评论

相关推荐 更多相似问题