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

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

  • 相关阅读:
    文档的几何形状和滚动
    聊聊并发——生产者消费者模式
    在JavaScript中什么时候使用==是正确的?
    HTML5使用canvas画图时,图片被自动放大模糊的问题
    获取元素的几种方式
    利用jQuery和CSS实现环形进度条
    最实用、最常用的jQuery代码片段
    表格样式
    javascript常量的定义
    null 和 undefined 的区别
  • 原文地址:https://www.cnblogs.com/zhuxuekui/p/3553134.html
Copyright © 2011-2022 走看看