函数返回值为指针的问题
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不是一样的吗? 展开
{
char filename[] = “file_0001.dat”;
strcpy(filename,"file_xxxx");
return filename;
}
void main()
{
char* s;
s = GetFileName();
printf(“%s\n”, s);
}
请问怎么会有错呢?我想不通,函数不能返回指针吗?这个和返回int不是一样的吗? 展开
展开全部
#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吧.
#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吧.
展开全部
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语言 内存掌握很重要的
解决方法 是 自己 定义 指针 ,申请释放 内存 。这样就不会出错了
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语言 内存掌握很重要的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数中使用的内存会在函数调用完毕释放掉(好像叫堆栈)
所以你filename指向的空间已经被释放掉了
可以使用malloc(c++中用new和delete)来动态指定变量,这样只有在你free的时候才会释放空间
比如char *filename= (char*)malloc(20);
strcpy(filename,"file_xxx");
在调用该函数后,确定变量不用了千万记住要free,否则会造成内存泄露
所以你filename指向的空间已经被释放掉了
可以使用malloc(c++中用new和delete)来动态指定变量,这样只有在你free的时候才会释放空间
比如char *filename= (char*)malloc(20);
strcpy(filename,"file_xxx");
在调用该函数后,确定变量不用了千万记住要free,否则会造成内存泄露
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
函数本地/局部变量内存分配在堆栈上,在函数结束后堆栈释放就无效。数值可能还在堆栈上但任何新的函数调用都要重新准备堆栈,里面的数据在函数退出后就不可靠。
在堆上分配的(malloc/new)内存地址可以一直有效直到用free/delete释放。
在堆上分配的(malloc/new)内存地址可以一直有效直到用free/delete释放。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为你返回了一个局部变量的地址
GetFileName()调用完后filename[]的生命周期结束了,它的内存空间被释放,所以s得到的是一个垃圾内存
GetFileName()调用完后filename[]的生命周期结束了,它的内存空间被释放,所以s得到的是一个垃圾内存
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询