函数返回值为指针

   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释放。

     稍稍总结下,函数返回数组指针的这个地址不可靠,需要动态开辟地址,这样退出函数时将不会收走指针。而在函数内部定义的局部变量,退出函数时,释放资源,地址指针无效。