C关于局部指针生存周期的问题

对于一个函数char*getstr(void){chars[]="hello,world!";returns;}当s返回的时候s是不确定的,因为已经被释放了。但是书上写,... 对于一个函数
char *getstr( void )
{
char s[] = "hello,world!";
return s;
}
当s返回的时候s是不确定的,因为已经被释放了。

但是书上写,如果用指针就是安全的。如下:
char *getstr( void )
{
char *s = "hello world!";
return s;
}

我的问题是难道指针超出作用域就不会被释放吗?
虽然我知道str所指向的是静态空间的const char*。
但是当函数返回后。难道这个指针和这些字符都不会释放掉吗?

按我所想,我认为如下才是安全的。
static char *str = "hello world";

请各位指正一下。谢谢谢谢
展开
 我来答
J0nah
2010-02-26
知道答主
回答量:10
采纳率:0%
帮助的人:4.1万
展开全部
char s[] = "aaaa";
s[]是在栈空间分配的。
开辟了一串连续空间,把字符存入。
当离开作用域时s成为无效。

char *s = "aaaa";
*s同样是在栈上分配的。
这个空间内的地址是指向常量区的一个字符串。
当离开作用域时s同样无效。

至于为什么返回指针是安全的,我在这里说一下。
返回局部变量本来说来是有巨大隐患的。
但是这里返回的是一个常量区字符的地址。
上层函数接收后仍然可以访问那块常量区的字符串。
这个常量区的内容只有程序结束后才又操作系统回收。

另外静态区是全局变量,静态变量呆的地方。

就这个程序可以这样实验一下。
char *getstr( void )
{
char s[] = "abcdefg";

printf("\'%p\'\n" , s ); //查看s的第一个字符的地址。即'a'的地址
printf("\'%c\'\n" , *s ); //查看s的第一个字符

return s;
}

int main( void )
{
printf("getstr() is \'%s\'\n" , getstr() ); //查看返回的字符串
//你这里可以看到返回的字符串很可能已经面目全非了。

printf("\'%c\'" , *( ( int* )( 0x0012ff20 ) ) );
//直接访问内存地址,0x0012ff20是我机器上输出的地址。
//你这里可以改成getstr函数输出的那个地址来查看已释放的第一个字符。

getch();
return 0;
}
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
wo...l@gmail.com
2010-02-26
知道答主
回答量:48
采纳率:0%
帮助的人:0
展开全部
首先楼主不要把静态区和常量区搞混。
char s[]="aaaa";//"aaaa"分布在栈区,而不是常量区,这点楼主可以通过取地址来看看。出了括号就是否了,所以产生了悬垂指针。
char *s="aaaa";//"aaaa"分布在常量区,所以出了括号后没有被释放,所以可以返回
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式