char *GetMemory3(int num)的问题

char *GetMemory3(int num)

{

    char *p = (char *)malloc(sizeof(char) * num);

    return p; //返回指针p

}
 
void Test3(void)

{

    char *str = NULL;

    str = GetMemory3(100);  //这里指针str也和指针p的指向一样的内存块。

    strcpy(str, "hello");

    cout<< str << endl;

    free(str);  //这里最终只是释放了str指向的内存块,对于str指针依然还是指向那块内存,看了一些资料说应该加一句str=0;那指针p呢?p也依然在指向那块内存啊。

}
 

回复:

答者:wutaozhao() 信誉:100 级别:user2 日期:2007-6-29 21:42:21 id:41451636


指针之间传递的就是地址,所以str和p所指向的内存块是同一个,释放其中任何一个即可

答者:what_a_big() 信誉:100 级别:user1 日期:2007-6-29 21:42:21 id:41451637


指针p呢?
=============================================================================
after returning from GetMemory()
p ( 局部变量)没了,那块内存还在。
现在str 指向那块内存。

看了一些资料说应该加一句str=0
=================================
也可以不写str=NULL,只要你不再引用str。

答者:believefym(feng) 信誉:100 级别:user5 日期:2007-6-29 21:50:38 id:41451675


同一块内存,释放一次即可,只不过所有指向那块内存的 指针都失效了,就像楼主代码里的p和str

释放之后str就变成了野指针,加str=NULL,可以避免之后错误使用该指针,方便调试

答者:lightnut() 信誉:100 级别:star1 日期:2007-6-29 22:05:48 id:41451736


1.
函数进入Test3():
char* str = NULL;

======================
变量   变量的地址         变量的值(内容)
str    0x0013fe8c         0

2.
str = GetMemory3(..)=====>
char *p = (char *)malloc(sizeof(char) * num);
将分配的内存起始地址(0x003a60b0)赋给栈变量p,

===============================================
变量     变量的地址       变量的值(内容)
p        0x0013fda8       0x003a60b0

3. 从GetMemory3(..)返回, p的值(0x003a60b0)
拷贝给str, 栈变量p生命结束, 释放其所占栈内存
(地址0x0013fda8)

=================================================
变量       变量的地址     变量的值(内容)
str        0x0013fe8c      0x003a60b0

4. free(str):  释放str指向的内存(0x003a60b0开始的内存空间)
5. 推出Test3()后,  栈变量str生命结束, 释放其所占栈内存
(地址0x0013fe8c)

答者:freshui(五月的风 -最近老犯困) 信誉:100 级别:user1 日期:2007-6-29 22:12:07 id:41451763


呵呵 p没了
已经死了 
:)

注意看变量的作用域

答者:buhaohaoxuexi() 信誉:100 级别:user1 日期:2007-6-29 22:37:00 id:41451888


为什么会死呢,不是说动态分配是分配在堆上的吗?他不应该死啊。

答者:yydrewdrew(满堂花醉三千客,一剑霜寒十四州) 信誉:100 级别:user1 日期:2007-6-29 23:55:01 id:41452325


char *GetMemory3(int num)

{

    char *p = (char *)malloc(sizeof(char) * num);

    return p; //返回指针p

}
 
void Test3(void)

{

    char *str = NULL;

    str = GetMemory3(100);  //调用完后p被析构,p为局部作用域存在于函数GetMemory3的栈中,当GetMemory3被调用完后,栈空间被释放,因而被析构。

    strcpy(str, "hello");

    cout<< str << endl;

    free(str);  //这里最好加一句str = NULL。

}

答者:yydrewdrew(满堂花醉三千客,一剑霜寒十四州) 信誉:100 级别:user1 日期:2007-6-29 23:56:59 id:41452334


注意p和它指向的对象的生命期是两回事
p是一个 局部 指针,而它指向的对象是堆空间具有全局生命期

答者:xlbdan(流浪剑客) 信誉:100 级别:user5 日期:2007-6-30 0:15:43 id:41452409


return p; //返回 指针p


这里返回之后,p已经消失.
但是p指向的那块内存依然存在,并且被返回到了调用端,用str接收了.
所以只要free(str)就行了,也就释放了p申请的那块内存
然后把 str赋为NULL,是防止再错误的去使用它

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值