使函数返回指向字符串的指针是否不安全?

daidaoke 2002-08-05 09:54:04
请大家看看下面的一个函数:
char *f(){
char s[]="abcde";
return(s);
}

int main(){
char *ss;
ss=f();
printf("%s\n",ss);
}

这个程序可以正确的打印出abcde。
但是我考虑,因为s是函数f内部的局部变量,从函数f返回后,s的存储区已经不安全了,可能被其他程序覆盖,因此这样的函数是不安全的。
我的想法对吗?
...全文
206 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexxing 2002-08-06
  • 打赏
  • 举报
回复
char *f(){
char s[]="abcde";
return(s);
}
不安全
改成
char *f(){
const char * s="abcde";
return(s);
}
就安全了,根本就不需要malloc那么麻烦,这等效于
char *f(){
return "abcde";
}
lj0057 2002-08-06
  • 打赏
  • 举报
回复
我认为s中的“abcde”能够暂时存在(只要没有程序向这块内存中写入内容),但其已经为可用内存,确实不安全。如想让它在执行完函数f()后还可用,应该用static定义。
daidaoke 2002-08-06
  • 打赏
  • 举报
回复
谢谢大家
jcsun 2002-08-05
  • 打赏
  • 举报
回复
记住一点就可以了,
函数中分配的空间不能返回,因为函数跳出,该空间就释放。
函数之外的可以,因为不释放。例如全局变量获输入字符串参数。
kwok_1980 2002-08-05
  • 打赏
  • 举报
回复
char *f(){
char s[]="abcde";
char *p=new char(sizeof(s));
strcpy(p,a);
return(p);
}

有错请指正!
liushmh 2002-08-05
  • 打赏
  • 举报
回复
yes,very good
more detail please see the c++ primer
Andy 2002-08-05
  • 打赏
  • 举报
回复
当然会出错了,数组s是一个局部变量,即在栈中存放,从f返回后,s就被摧毁了,main中的ss指向一个无效的区域,在我的机器上,打印出来的不是abcde,而是乱码
killjoy 2002-08-05
  • 打赏
  • 举报
回复
局部指针除了const 与 static以外都是危险的。
shornmao 2002-08-05
  • 打赏
  • 举报
回复
不错,是这样的。但是如果
const char *f()
{
const char *s="abcde";
return s;
}
则是安全的。
killjoy 2002-08-05
  • 打赏
  • 举报
回复
你这个想法是很危险的,返回局部指针,永远都不要这样做!
pwk 2002-08-05
  • 打赏
  • 举报
回复
“char *ss”这种写法才是错的,函数f中的写法才是没有问题的,切记为ss分配存储空间,因为函数返回的是字符串,在unix下这样写是会coredump的!
d_selenite 2002-08-05
  • 打赏
  • 举报
回复
kwok_1980(Mars)
你的程序中分配的空间谁来负责释放?
alou 2002-08-05
  • 打赏
  • 举报
回复
#include <stdio.h>

char *f(){
char s[] = "abcde";
char *s1 = "abcde";
return(s);
}

int main(){
char *ss;
ss=f();
printf("%s\n",ss);
}

单步跟踪,注意s与s1的值。
注意"abcde"是全局的。

70,032

社区成员

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

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