c语言函数返回指针时,我定义了个局部变量*p,然后用malloc给p分配地址,给*p赋值,返回 p,有个疑问

函数的局部变量使用后不是都会被遣散吗,为什么调用这个函数,*p的值就是函数里赋的值呢?还是说因为malloc分配的地址,所以又不一样了?... 函数的局部变量使用后不是都会被遣散吗,为什么调用这个函数,*p的值就是函数里赋的值呢?还是说因为malloc分配的地址,所以又不一样了? 展开
 我来答
vsysy1
推荐于2017-05-23 · 超过14用户采纳过TA的回答
知道答主
回答量:20
采纳率:0%
帮助的人:16.9万
展开全部
局部变量在局部结束后是会释放的。
看以下:
int abc()
{
char*p = (char*)malloc(10);
}

abc() 函数被调用完后p本身被释放了,但是p存的值(一个地址)所指向的内存块是没有被释放的,必须要手动调用free函数来释放。

最简单的比喻,
在一张纸条写着上海的地址,然后把纸条烧了,上海会被烧没吗?
纸条和上海是独立的。上海烧了根纸条烧不烧没关系,纸条烧了也跟上海没关系。
char*p = (char*)malloc(10);//就相当于把上海的地址写进纸条一样,p就是纸条

malloc()是申请一块内存,返回的是这块内存的位置,而p存的是这块内存的地址,内存块本身还是在内存的那个位置上,跟p的关系只是其位置被p存储了
追问
那再问下,如果我要free malloc分配的地址,在调用这个函数后,free 可以吗?比如,q=f(); 
。。。
free(q);
free 是具体释放那块地址,跟变量是不是没有关系?
追答
一、解答
可以的,
free就是根据地址找到内存位置,然后释放内存的。然而存放地址的局部变量p仍然是在的。注意不可重复free同一个地址。

二、示列
char* myMalloc()
{
char*p = (char*)malloc(10);

return p;
}

调用
void main()
{
char* q = myMalloc();/*这里myMalloc里面的局部变量p释放了,但存指向的内存没释放,内存地址返回给了q*/
free(q);/**这里q所存的内存被释放了,但q本身没有释放*/
q = NULL;/*在释放完一个内存后,最好把这个指针置空,因为它仍然存放的是被释放了的内存的地址,这是为了防止访问已经被释放的内存,这也是个好习惯*/

}/**main函数结束时q才释放*/
六季相灭1d
2015-06-17 · 超过59用户采纳过TA的回答
知道小有建树答主
回答量:129
采纳率:33%
帮助的人:89.3万
展开全部
*p里的值不变, 因为p是堆内存上分配的,所以不会丢。
一般栈上分配调用完后就清空临时变量。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式