"栈内存"引出问题

cir2633 2009-07-20 10:18:29
在函数内初始化的指针是局部变量,使用栈内存,此函数返回时会消亡 ,林锐老师写strcpy函数:

char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ )
NULL ;
return address ;
}

其中的char *address = strDest, address这个指针岂不也会在函数结束时消亡 ?
那这个return address还正确吗?

-------------------下面的例子仍然引用自林锐的高质量编程

char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
这段代码有无问题 ?
...全文
73 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cir2633 2009-07-20
  • 打赏
  • 举报
回复
我觉得:address这个指针是函数内定义的变量,故在函数结束销毁,但address的值被返回了,这个值就是目标字符串的地址,并且这个字符串是在全局区的,不是在栈上,这个字符串不会因为函数结束而销毁
superbtl 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cir2633 的回复:]
另外请看看我这句话对不对~~:如果函数内定义了一个指针,并让此指针指向了一块内存, 那么函数结束后,指针本身没有被销毁,但指针指向的内容有可能被销毁;如果内存在栈上则销毁/如果内存在堆上保留
[/Quote]我认为不对 虽然你的指针是局部变量 但你指针指向的内存没有消亡 无论是栈还是堆上的
zhangxfeng112 2009-07-20
  • 打赏
  • 举报
回复
以上代码准确无误,鉴定完毕。
[Quote=引用 2 楼 cir2633 的回复:]
另外请看看我这句话对不对~~:如果函数内定义了一个指针,并让此指针指向了一块内存, 那么函数结束后,指针本身没有被销毁,但指针指向的内容有可能被销毁;如果内存在栈上则销毁/如果内存在堆上保留
[/Quote]
说得不对,应该说:如果函数内定义了一个指针,并让此指针指向了一块内存, 那么函数结束后,指针本身因为是局部变量,在栈上肯定被被销毁,而它原来指向的内存,可能被销毁;如果内存在栈上则销毁/如果内存在堆上保留。

底层实现是这样的:当函数返回一个局部变量指针时,要先把这个指针的值保存到寄存器eax中,这时eax就指向那块内存了,然后销毁栈上的指针变量。
zhangxfeng112 2009-07-20
  • 打赏
  • 举报
回复
以上代码准确无误,鉴定完毕。
[Quote=引用 2 楼 cir2633 的回复:]
另外请看看我这句话对不对~~:如果函数内定义了一个指针,并让此指针指向了一块内存, 那么函数结束后,指针本身没有被销毁,但指针指向的内容有可能被销毁;如果内存在栈上则销毁/如果内存在堆上保留
[/Quote]
说得不对,应该说:如果函数内定义了一个指针,并让此指针指向了一块内存, 那么函数结束后,指针本身因为是局部变量,在栈上肯定被被销毁,而它原来指向的内存,可能被销毁;如果内存在栈上则销毁/如果内存在堆上保留。

底层实现是这样的:当函数返回一个局部变量指针时,要先把这个指针的值保存到寄存器eax中,这时eax就指向那块内存了,然后销毁栈上的指针变量。
superbtl 2009-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 steedhorse 的回复:]
函数退出后消忘了,但它的值通过返回值传出来了,而且幸好这个值(即指针指向的位置)并不是函数局部的位置。
[/Quote]我觉得说的很对了
abcdef0966 2009-07-20
  • 打赏
  • 举报
回复
第一个,应该是没有问题的
不要返回指向局部变量的指针或引用,因为局部变量是在栈中定义的,函数结束后这段空间就被释放掉
这里address虽然是局部变量,但是它指向的内存空间(也就是strDest指向的内存空间)不是在该子函数的栈上,函数结束后这段内存空间不会消失,所以返回是没有问题的。只不过返回后address这个变量消失了而已。

第二个:
返回的是指向堆的指针
返回后,p消失了(因为p在栈上),但是堆是不会自行消失的,所以可以返回p
但是有一点,在调用这个函数的主函数里,应当手动释放这段堆空间
abcdef0966 2009-07-20
  • 打赏
  • 举报
回复
第一个,应该是没有问题的
不要返回指向局部变量的指针或引用,因为局部变量是在栈中定义的,函数结束后这段空间就被释放掉
这里address虽然是局部变量,但是它指向的内存空间(也就是strDest指向的内存空间)不是在该子函数的栈上,函数结束后这段内存空间不会消失,所以返回是没有问题的。只不过返回后address这个变量消失了而已。

第二个:
返回的是指向堆的指针
返回后,p消失了(因为p在栈上),但是堆是不会自行消失的,所以可以返回p
但是有一点,在调用这个函数的主函数里,应当手动释放这段堆空间
jinzonghui 2009-07-20
  • 打赏
  • 举报
回复
return address,在消亡之前是不是已经返回了。我个人这么觉得的。呵呵。
jinzonghui 2009-07-20
  • 打赏
  • 举报
回复
return address,在消亡之前是不是已经返回了。我个人这么觉得的。呵呵。
liaoweixiaoyu 2009-07-20
  • 打赏
  • 举报
回复
指针销毁了,但指针指向的那块内存的内容返回了。
cir2633 2009-07-20
  • 打赏
  • 举报
回复
另外请看看我这句话对不对~~:如果函数内定义了一个指针,并让此指针指向了一块内存, 那么函数结束后,指针本身没有被销毁,但指针指向的内容有可能被销毁;如果内存在栈上则销毁/如果内存在堆上保留
晨星 2009-07-20
  • 打赏
  • 举报
回复
函数退出后消忘了,但它的值通过返回值传出来了,而且幸好这个值(即指针指向的位置)并不是函数局部的位置。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧