C语言关于地址传递与形参实参的问题
我听说一个函数里面的变量(即局部变量)的存储存储单元是随着执行进入到下一个函数释放存储的空间的;比如:#include<stdio.h>voidshuchu(int*p)...
我听说一个函数里面的变量(即局部变量)的存储存储单元是随着执行进入到下一个函数释放存储的空间的;比如:
#include<stdio.h>
void shuchu(int*p)
{
printf("%d\n",*p);
}
int main()
{
int a=3;
shuchu(&a);
}
当执行到shuchu函数的时候,main函数的变量a所占的存储单元是否就释放了?如果是,那把a变量的地址传过shuchu函数后,a变量可以认为不存在了吗,那怎么能够通过*p来输出a变量的值(即3)呢?
—————————————————————————————————————————————
#include<stdio.h>
int *shuru()
{
int a=3;
return &a;
}
void shuchu(int *p)
{
printf("%d\n",*p);
}
int main()
{
int *x;
x=shuru();
shuchu(x);
}
我知道第一个程序是可以输出3的,,但我的第二个程序,同样也是为了输出3,但得不到结果,结果是
一个系统给的任意的数,第二个程序我没有在主函数定义一个变量3,而在一个shuru函数定义变量a,传a的地址给主函数,然后主函数用一个指针变量x接受,再把x做实参个shuchu函数,,,如果说shuru函数把地址传给主函数时候,a的存储单元被释放了,那,第一个程序不也同样如此吗? 展开
#include<stdio.h>
void shuchu(int*p)
{
printf("%d\n",*p);
}
int main()
{
int a=3;
shuchu(&a);
}
当执行到shuchu函数的时候,main函数的变量a所占的存储单元是否就释放了?如果是,那把a变量的地址传过shuchu函数后,a变量可以认为不存在了吗,那怎么能够通过*p来输出a变量的值(即3)呢?
—————————————————————————————————————————————
#include<stdio.h>
int *shuru()
{
int a=3;
return &a;
}
void shuchu(int *p)
{
printf("%d\n",*p);
}
int main()
{
int *x;
x=shuru();
shuchu(x);
}
我知道第一个程序是可以输出3的,,但我的第二个程序,同样也是为了输出3,但得不到结果,结果是
一个系统给的任意的数,第二个程序我没有在主函数定义一个变量3,而在一个shuru函数定义变量a,传a的地址给主函数,然后主函数用一个指针变量x接受,再把x做实参个shuchu函数,,,如果说shuru函数把地址传给主函数时候,a的存储单元被释放了,那,第一个程序不也同样如此吗? 展开
展开全部
你的第一个代码,主函数里定义的a不会释放,所以可以正常输出;
但第二个代码中,shuru()函数返回a的地址后,a所占的空间被释放,所以shuchu(x)是一个随机值。
改成全局变量吧。
#include<stdio.h>
int a=3;
int *shuru()
{
return &a;
}
void shuchu(int *p)
{
printf("%d\n",*p);
}
int main()
{
int *x;
x=shuru();
shuchu(x);
}
追问
一般什么情况下变量会释放或者不释放呢?
追答
动态申请的内存需要手动释放,比如 malloc对应free new对应delete;
注意不要出现悬垂指针;
功能函数内申请的局部变量在函数执行完毕后,会自动释放;
主函数的变量和全局变量在程序结束后自动释放;
全局变量会被局部变量覆盖。
展开全部
x=shuru();//shru中的a是一个局部变量,结束已经释放,
shuchu(x);//这里向x指向的内存内容为未知,不一定是3了
shuchu(x);//这里向x指向的内存内容为未知,不一定是3了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个局部变量的生命周期仅仅存在于一对花括号之内。理解理解,欢迎追问。
追问
一个变量在主函数内,当主函数把这个变量的地址作为实参传递给一个子函数时候?那是不是这个主函数内的变量就相当于不存在呢,,,那子函数如何能够通过*p这样的形式输出这个主函数变量的值呢(我的理解是这个变量已经释放所谓的存储单元了,就不可能在保持一个值了吧?)?
追答
局部变量的生命周期在花括号之内,那么主函数中定义的局部变量肯定实在主函数运行完才释放的,而子函数内定义的局部变量也会在调用子函数完毕就释放,所以子函数中自动分配的变量不能在主函数中使用,而主函数中定义的变量可以通过传址给子函数让子函数来访问主函数中的变量。不懂继续问。最好闻细一点,越细越好。
你说的上面的情况,主函数把变量的地址作为实参传给子函数之后,主函数的变量时存在的,变量的分配与释放遵循谁分配谁释放的原则,而且是在所属函数运行完之后释放。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在main函数中,变量a的生存周期是整个函数,当传递参数时,把a复制了一份,传递的只是复制后的a,所以*p输出的还是a的值。
第二个函数中。shuru函数是个很错误的做法,他返回了局部变量的地址,当shuru函数结束时,函数所占资源都被系统收回,此时变量a已经被释放了,指针x所指地址确实是变量a的地址,但是该地址的内容已经不确定了,所以数据无法预知。
第二个函数中。shuru函数是个很错误的做法,他返回了局部变量的地址,当shuru函数结束时,函数所占资源都被系统收回,此时变量a已经被释放了,指针x所指地址确实是变量a的地址,但是该地址的内容已经不确定了,所以数据无法预知。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询