免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7539 | 回复: 26

局部变量会在函数返回之后就销毁吗? [复制链接]

论坛徽章:
0
发表于 2009-04-03 11:18 |显示全部楼层
局部变量以及分配的内存会在函数返回之后就应该被回收?

#include <stdio.h>
char* getstring()
{
        char *string = "wo shi sunkang";
        return string;
}
int main()
{
        char* string = getstring();
        printf("string = %s\n",string);
}

程序中的getstring()函数中的string的内容还可以返回回来阿
请高手指教一下

论坛徽章:
0
发表于 2009-04-03 11:21 |显示全部楼层
那分配的局部变量又是在什么时候被销毁的呢?

论坛徽章:
0
发表于 2009-04-03 11:22 |显示全部楼层
你的字符串指针指向的是常量,你把常量的地址返回了

论坛徽章:
0
发表于 2009-04-03 11:30 |显示全部楼层
原帖由 @sky 于 2009-4-3 11:22 发表
你的字符串指针指向的是常量,你把常量的地址返回了

分配的内存也应该被free掉了  所以地址也没了吧

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-04-03 12:11 |显示全部楼层
原帖由 cuer_2 于 2009-4-3 11:21 发表
那分配的局部变量又是在什么时候被销毁的呢?

函数返回的时候。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-04-03 12:12 |显示全部楼层
原帖由 cuer_2 于 2009-4-3 11:30 发表

分配的内存也应该被free掉了  所以地址也没了吧

字符串常量在程序的整个生存期里面都可见。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-04-03 12:13 |显示全部楼层
原帖由 cuer_2 于 2009-4-3 11:18 发表
局部变量以及分配的内存会在函数返回之后就应该被回收?

#include
char* getstring()
{
        char *string = "wo shi sunkang";
        return string;
}

你这个例子选的根本就不恰当,一般说明这个问题的都是用如下的例子:

  1. void *foo(void)
  2. {
  3.     char *a[100];
  4.     return a;
  5. }
复制代码

论坛徽章:
0
发表于 2009-04-03 12:18 |显示全部楼层
你这样可以访问,但是有问题,因为你访问了不确定的地址空间。假如

char* string = getstring()+20;

你一样可以得到些东西。

论坛徽章:
0
发表于 2009-04-03 14:42 |显示全部楼层
会释放的,但正如7楼所说,一般都用他那个例子来讨论
即使你可以得到结果,那也是因为那个地址的内容在你访问之前没有被其他程序改写掉,可以在返回前加个printf再试一下

论坛徽章:
0
发表于 2009-04-04 18:12 |显示全部楼层
原帖由 MMMIX 于 2009-4-3 12:13 发表

你这个例子选的根本就不恰当,一般说明这个问题的都是用如下的例子:

void *foo(void)
{
    char *a[100];
    return a;
}


用你的例子确实很能说明这个问题
但是我的那个例子为什么就不行呢?
毕竟还是得到了局部地址
如果被释放的话 这个局部地址怎么就得到了
而你的例子的局部地址就被释放了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP