二级指针的输入输出模型

二级指针的输入输出模型

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

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

 

 

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

分析:在子函数里分配内存,保存字符串,在调用函数里可以用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指向的地址没法被修改,造成野指针问题。

posted on 2019-01-23 16:19 锋邢天下 阅读(...) 评论(...) 编辑 收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值