zoukankan      html  css  js  c++  java
  • 函数返回值为指针

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

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

  • 相关阅读:
    Excel 之查找与替换
    重拾Excel之为什么
    taobao
    祝我生日快乐
    啊哈哈哈哈!自由啦
    我是不是得了抑郁症?
    Be quiet
    tcpdump tutorial
    Java Thread 多线程同步、锁、通信
    java 堆、栈、常量池等
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3553134.html
Copyright © 2011-2022 走看看