浅谈在函数中返回动态的内存

 更新时间:2016年12月22日 09:40:54   投稿:jingxian  
下面小编就为大家带来一篇浅谈在函数中返回动态的内存。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

1、有以下题目:

#include <iostream>
using namespace std;

void GetMemeory(char* p)
{
  p=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}

我们期望的输出是:ThunderDownloader

然而当我们运行此段代码的时候发现,程序崩溃了。

其实我们深入分析下不难发现,当我们传入str到GetMemeory()函数中的时候,该函数我们创建了一个临时

的指针变量片p,然后将其指向NULL。然后我们为临时指针变量p动态分配内存,注意,当我们在返回的时候

整个临时指针变量是释放掉的,因为其内存是在栈内存中分配的。但是我们之前传入的str的内存地址与临时变量

的内存地址是不相同的。所以此时str不能获取在函数GetMemmory分配的内存,因此后面的字符串复制和链接操作

都将造成程序崩溃。

我们可以用下面的图形更加生动的这一过程:

:

假设str本身内存为0x123 临时指针变量p的内存为0x456 动态分配的内存起始地址为0x789

当GetMemory函数结束的时候p被释放,而再也无指针指向这块动态分配的内存了。另外str也不可能

获取这段动态分配的内存的地址。所以也造成了内存泄露。

我们可以用如下两种方法解决这一问题:

一种是二级指针:

#include <iostream>
using namespace std;

void GetMemeory(char** p)
{
  (*p)=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(&str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}

运行截图为:

关于二级指针的方法可以参考如下的流程图:

一种是指针的引用方法:

#include <iostream>
using namespace std;

void GetMemeory(char*& p)
{
  p=(char*)malloc(sizeof(char)*100);
}

int main()
{
  char *str=NULL;
  GetMemeory(str);
  strcpy(str,"Thunder");
  strcat(str,"Downloader");
  printf(str);
  system("pause");
  return 0;
}

运行截图:

关于指针引用方法的流程图如下:

能力有限,难免有没说清楚的地方,还望包涵。

以上就是小编为大家带来的浅谈在函数中返回动态的内存全部内容了,希望大家多多支持脚本之家~

相关文章

  • c语言conio.h基本知识点总结

    c语言conio.h基本知识点总结

    在本篇文章里小编给大家分享的是关于c语言conio.h是什么意思的相关知识点,需要的朋友们可以学习参考下。
    2020-02-02
  • 基于OpenCV自定义色条实现灰度图上色功能代码

    基于OpenCV自定义色条实现灰度图上色功能代码

    今天通过本文给大家分享基于OpenCV自定义色条实现灰度图上色功能代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-11-11
  • C语言数组和指针的问题一道非常值得深思的笔试题

    C语言数组和指针的问题一道非常值得深思的笔试题

    今天小编就为大家分享一篇关于C语言数组和指针的问题一道非常值得深思的笔试题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言关于二叉树中堆的创建和使用整理

    C语言关于二叉树中堆的创建和使用整理

    大家好,这里是针对二叉树中堆结构的顺序储存,整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步
    2022-08-08
  • C++中套接字库sockpp的使用详解

    C++中套接字库sockpp的使用详解

    sockpp是一个开源、简单、现代的C++套接字库,这篇文章主要为大家详细介绍一下套接字库sockpp的使用,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2023-11-11
  • 对C语言中指针的理解与其基础使用实例

    对C语言中指针的理解与其基础使用实例

    这篇文章主要介绍了对C语言中指针的理解与其基础使用实例,文中援引了知乎热门问题"为什么说指针是 C 语言的精髓?"中的精彩回答,需要的朋友可以参考下
    2016-03-03
  • Sersync+Rsync实现触发式文件同步实战过程

    Sersync+Rsync实现触发式文件同步实战过程

    sersync是使用c++编写,而且对linux系统文 件系统产生的临时文件和重复的文件操作进行过滤。下面通过本文给大家分享Sersync+Rsync实现触发式文件同步实战过程,需要的朋友参考下吧
    2017-09-09
  • Qt物联网管理平台之实现告警短信转发

    Qt物联网管理平台之实现告警短信转发

    系统在运行过程中,会实时采集设备的数据,当采集到的数据发生报警后,可以将报警信息以短信的形式发送给指定的管理员。本文将利用Qt实现告警短信转发,感兴趣的可以尝试一下
    2022-07-07
  • C++ OpenCV实战之零部件的自动光学检测

    C++ OpenCV实战之零部件的自动光学检测

    这篇文章主要为大家介绍一个C++ OpenCV的实战——零部件的自动光学检测,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • C语言的基本语法详解

    C语言的基本语法详解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助
    2021-09-09

最新评论