函数返回值为指针的问题

char*GetFileName(){charfilename[]=“file_0001.dat”;strcpy(filename,"file_xxxx");return... char* GetFileName()
{
char filename[] = “file_0001.dat”;
strcpy(filename,"file_xxxx");
return filename;
}
void main()
{
char* s;
s = GetFileName();
printf(“%s\n”, s);
}
请问怎么会有错呢?我想不通,函数不能返回指针吗?这个和返回int不是一样的吗?
展开
 我来答
来自虞山小巧玲珑的黄盖
推荐于2016-02-05 · TA获得超过704个赞
知道小有建树答主
回答量:1158
采纳率:0%
帮助的人:0
展开全部
#include "stdio.h"
#include "string.h" //这里记得要引用这个库,这是strcpy的头文件
char* GetFileName()
{
char filename[20] = "file_0001.dat"; //这块不能用filename[],
//没有这种类型,那种形式只能做为函数参数来使用,不能用在变量声明
//这里声明的filename是一个局部变量,退出函数时将被编译器收回分配的空间
strcpy(filename,"file_xxxx");
return filename; //由于filename是一个局部变量,退出函数时将被编译器收回分配的空间
} //所以返回的时候将失败
void main()
{
char* s;
s = GetFileName();
printf("%s\n", s);
}
如果想返回一个有效的地址,那么就用malloc吧

#include "stdio.h"
#include "string.h" //这里记得要引用这个库,这是strcpy的头文件
#include "stdlib.h"
char* GetFileName()
{
char *filename = (char*)malloc(20); //这里用的是malloc动态分配的地址.这样退出函数时将不会收走指针

strcpy(filename,"file_xxxx");
return filename;//这时filename是动态分配的地址,所以退出函数时不会被收回空间
}
void main()
{
char* s;
s = GetFileName();
printf("%s\n", s);
free(s);//用完指针记得收回
}

上面的两个实例我都有注释.希望你能明白.
如果还有什么不明白加我百度HI吧.
小笨聪
2009-08-04
知道答主
回答量:26
采纳率:0%
帮助的人:6.1万
展开全部
filename 是数组的首地址呀 ,是由系统申请 释放 内存的 ,在 函数结束的时候filename[] 的 内存 已经被释放 了 的 所以 出错了

解决方法 是 自己 定义 指针 ,申请释放 内存 。这样就不会出错了

char* GetFileName()
{
char *filename
filename=(char *)malloc(sizeof (char)*20);//此处申请内存大小,为一个
//定值,更专业需要设置缓冲
filename=“file_0001.dat”; //给指针赋值
strcpy(filename,"file_xxxx");
return filename;
}
void main()
{
char* s;
s = GetFileName();
printf(“%s\n”, s);
}

学习c语言 内存掌握很重要的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lgqss
2009-08-04 · TA获得超过111个赞
知道小有建树答主
回答量:164
采纳率:0%
帮助的人:149万
展开全部
函数中使用的内存会在函数调用完毕释放掉(好像叫堆栈)

所以你filename指向的空间已经被释放掉了

可以使用malloc(c++中用new和delete)来动态指定变量,这样只有在你free的时候才会释放空间

比如char *filename= (char*)malloc(20);
strcpy(filename,"file_xxx");
在调用该函数后,确定变量不用了千万记住要free,否则会造成内存泄露
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bigbore
2009-08-04 · TA获得超过1.1万个赞
知道大有可为答主
回答量:2080
采纳率:0%
帮助的人:0
展开全部
函数本地/局部变量内存分配在堆栈上,在函数结束后堆栈释放就无效。数值可能还在堆栈上但任何新的函数调用都要重新准备堆栈,里面的数据在函数退出后就不可靠。

在堆上分配的(malloc/new)内存地址可以一直有效直到用free/delete释放。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
火爆天鹅By
2009-08-04 · TA获得超过153个赞
知道答主
回答量:166
采纳率:0%
帮助的人:0
展开全部
因为你返回了一个局部变量的地址
GetFileName()调用完后filename[]的生命周期结束了,它的内存空间被释放,所以s得到的是一个垃圾内存
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式