社区
C语言
帖子详情
使函数返回指向字符串的指针是否不安全?
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
打赏
收藏
使函数返回指向字符串的指针是否不安全?
请大家看看下面的一个函数: char *f(){ char s[]="abcde"; return(s); } int main(){ char *ss; ss=f(); printf("%s\n",ss); } 这个程序可以正确的打印出abcde。 但是我考虑,因为s是函数f内部的局部变量,从函数f返回后,s的存储区已经不安全了,可能被其他程序覆盖,因此这样的函数是不安全的。 我的想法对吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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"是全局的。
C/C++
指针
经典资料大全
C/C++
指针
经典资料大全,十余部经典资料书籍,是您精通C
指针
的理想教程。
字符串
指针
和
指向
字符串
的
指针
变量
字符串
指针
字符串
的首地址;
字符串
指针
变量 例:char *strp=“hello”; 定义了一个
指向
字符串
的
指针
变量,并将
字符串
的首地址赋值给strp
指针
变量,即:使
指针
变量strp
指向
字符串
首地址; 输出: (1)printf(“%s\n”,strp); (2)for(;*strp;strp++) printf("%c",*strp) 字符
指针
变量必须先赋值后使用,否则对系统构成危险。因此,...
字符串
--从
函数
返回
字符串
指针
这里mystrcat是
函数
名,因为()在C语言中具有最高的优先级,所以mystrcat将首先与()结合,表示mystrcat()是一个
函数
,他有两个形参dststr和srcstr,*号作为一元运算符比()得优先级稍低,所以他说明
函数
得
返回
值是一个字符
指针
。
函数
之间的握手(信息交换)是通过
函数
参数和
返回
值来实现的。一种常见的方法是利用数组或者
指针
作为
函数
参数,通过传地址调用来获得这些数据值,另一种方法就通过
返回
指针
值得
函数
来
返回
一个地址值,即只想存储器这些数据的一段连续内存空间得首地址,从而获得这些数据值。
C语言基础——
字符串
指针
(
指向
字符串
的
指针
)
C语言中没有类似java,python等面向对象的编程语言中string那样的特定的
字符串
类型,通常是将
字符串
放在一个字符数组中。 遍历
字符串
代码: #include<stdio.h> #include<string.h> void main(){ char str[] = "hello world"; int len = strlen(str),i; ...
C语言
返回
字符串
指针
函数
的两种写法及对比
C语言
返回
字符串
指针
函数
C语言
70,032
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章