c语言函数返回指针时,我定义了个局部变量*p,然后用malloc给p分配地址,给*p赋值,返回 p,有个疑问
函数的局部变量使用后不是都会被遣散吗,为什么调用这个函数,*p的值就是函数里赋的值呢?还是说因为malloc分配的地址,所以又不一样了?...
函数的局部变量使用后不是都会被遣散吗,为什么调用这个函数,*p的值就是函数里赋的值呢?还是说因为malloc分配的地址,所以又不一样了?
展开
2个回答
展开全部
局部变量在局部结束后是会释放的。
看以下:
int abc()
{
char*p = (char*)malloc(10);
}
abc() 函数被调用完后p本身被释放了,但是p存的值(一个地址)所指向的内存块是没有被释放的,必须要手动调用free函数来释放。
最简单的比喻,
在一张纸条写着上海的地址,然后把纸条烧了,上海会被烧没吗?
纸条和上海是独立的。上海烧了根纸条烧不烧没关系,纸条烧了也跟上海没关系。
char*p = (char*)malloc(10);//就相当于把上海的地址写进纸条一样,p就是纸条
malloc()是申请一块内存,返回的是这块内存的位置,而p存的是这块内存的地址,内存块本身还是在内存的那个位置上,跟p的关系只是其位置被p存储了
看以下:
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才释放*/
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询