zoukankan      html  css  js  c++  java
  • 二级指针的输入输出模型

    前面介绍完了一级指针的用法,后面开始介绍二级指针。包含二级指针的输入输出模型,二级指针三种内存模型,二个辅助指针变量挖字符串,多维数组做函数参数等。

    指针做输入是指在调用函数里分配内存,指针做输出是指在被调用函数里分配内存。

     

    需求: 编写一个函数,在函数内分配一段内存,并且在这段内存中存储字符串。

    分析:在子函数里分配内存,保存字符串,在调用函数里可以用char *p或者char buf[]来接收,为了节省内存还是用char *p来接收。

         这样的话需要在被调用函数里把p指向分配的那段内存,想在被调用函数里改变指针p的话必须传递p的地址,即,使用二级指针,代码如下

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int getMemLen(char **myp, int *mylen)
    {
      char *tmp = NULL;
      tmp = (char *)malloc(100);
      if (tmp == NULL) //申请内存失败
      {
        return -1;
      }

      strcpy(tmp, "abcdefg");
      *mylen = strlen(tmp); 
      *myp = tmp; //因为调用getMemLen时传入的参数是&p,所以可以通过*myp间接修改实参p的值。
            //这儿myp是二级指针,通过*来改变它指向的一级指针的值
    }

    void main()
    {
      char *p = NULL;
      int len = 0;
      int ret = 0;

      ret = getMemLen(&p, &len);

      system("pause");
      return;
    }

    需求:调用函数main中malloc一段内存,指针p指向这段内存的起始地址,要求编写被调用函数,在被调用函数中释放p指向的内存

    分析:如果只是释放p指向的这段内存的话用char *myp做形参,调用函数时把p传递给myp即可。

          但是这样有个隐患,就是我们虽然把malloc这段内存释放了,但是指针p还是指向这段内存,要想改变指针p的指向,需要用二级指针,用&p去传给形参

    void getMemFree(char** myp)
    {
      char*tmp = NULL;
      if (myp == NULL)
      {
        return;
      }
      tmp = *myp;
      free(tmp);
      *myp = NULL;//在把实参指针变量置NULL
      return;
    }

    void main()
    {
      char *p = NULL;
      p = (char *)malloc(100);
      if (p == NULL)
      {
        return;
      }
      getMemFree(&p);

      system("pause");
      return;
    }

    如果改成

    void getMemFree(char* myp)
    {
      if (myp == NULL)
      {
        return;
      }
      free(myp); //释放完指针变量所指向的内存空间后
      myp = NULL;//这个只能把形参指针置为NULL 实参指针不能置NULL 所以实参仍然是个野指针
      return;

    }

    getMemFree(p)

    这样的话,一样可以释放这段内存,但是指针p指向的地址没法被修改,造成野指针问题。

  • 相关阅读:
    Silverlight生命周期概述
    NVolecity 处理DataTable 小记
    Adobe CS6 安装的时候,安装到AdobeHelp 死掉的解决方法
    验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate 的解决办法
    为什么要写博客
    [原创]SQL发音考证(搜寻SQL86标准)
    [转载]《暗时间》:为什么你应该(从现在开始就)写博客
    [转载]《暗时间》:书写是为了更好的思考
    [原创]手把手教你写网络爬虫(1):网易云音乐歌单
    javascript简单的日历实现《转》
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10309669.html
Copyright © 2011-2022 走看看