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

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

  • 相关阅读:
    【测试管理】如何简单的新增用例模块
    【自动化框架开发】node.js+selenium基于mac框架架设v1.0.1
    【自动化框架开发】node.js+selenium基于mac框架架设v1.0.0
    python--导入导出数据
    python爬虫--运用cookie模拟登录知乎
    python爬虫--连接数据库2
    python爬虫--模拟登录知乎
    python爬虫--连接数据库1
    python爬虫--储存本地
    python爬虫--解析网页几种方法之BeautifulSoup
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3553134.html
Copyright © 2011-2022 走看看