1: #include "stdio.h"
2: #include "string.h" //这里记得要引用这个库,这是strcpy的头文件
3: char* GetFileName()
4: {
5: char filename[20] = "file_0001.dat"; //这块不能用filename[],
6: //没有这种类型,那种形式只能做为函数参数来使用,不能用在变量声明
7: //这里声明的filename是一个局部变量,退出函数时将被编译器收回分配的空间
8: strcpy(filename,"file_xxxx");
9: return filename; //由于filename是一个局部变量,退出函数时将被编译器收回分配的空间
10: } //所以返回的时候将失败
11: void main()
12: {
13: char* s;
14: s = GetFileName();
15: printf("%s ", s);
16: }
17: 如果想返回一个有效的地址,那么就用malloc吧
18: #include "stdio.h"
19: #include "string.h" //这里记得要引用这个库,这是strcpy的头文件
20: #include "stdlib.h"
21: char* GetFileName()
22: {
23: char *filename = (char*)malloc(20); //这里用的是malloc动态分配的地址.这样退出函数时将不会收走指针
24: strcpy(filename,"file_xxxx");
25: return filename;//这时filename是动态分配的地址,所以退出函数时不会被收回空间
26: }
27: void main()
28: {
29: char* s;
30: s = GetFileName();
31: printf("%s ", s);
32: free(s);//用完指针记得收回
33:
34: }
函数本地/局部变量内存分配在堆栈上,在函数结束后堆栈释放就无效。数值可能还在堆栈上但任何新的函数调用都要重新准备堆栈,里面的数据在函数退出后就不可靠。
在堆上分配的(malloc/new)内存地址可以一直有效直到用free/delete释放。
稍稍总结下,函数返回数组指针的这个地址不可靠,需要动态开辟地址,这样退出函数时将不会收走指针。而在函数内部定义的局部变量,退出函数时,释放资源,地址指针无效。