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

发布时间 - 2026-01-10 22:00:52    点击率:

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;
}

运行截图:

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

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

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


# 函数返回动态内存  # 当我们  # 这一  # 动态分配  # 可以用  # 是在  # 两种  # 将其  # 这段  # 都将  # 造成了  # 这块  # 没说  # 浅谈  # 也不可能  # 小编  # 大家多多  # 还望  # 存了  # 崩溃了  # int 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何用5美元大硬盘VPS安全高效搭建个人网站?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  如何在IIS7上新建站点并设置安全权限?  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  如何用景安虚拟主机手机版绑定域名建站?  浅谈javascript alert和confirm的美化  利用JavaScript实现拖拽改变元素大小  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  JavaScript如何实现错误处理_try...catch如何捕获异常?  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  网站建设整体流程解析,建站其实很容易!  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  Laravel如何集成Inertia.js与Vue/React?(安装配置)  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  教学论文网站制作软件有哪些,写论文用什么软件 ?  开心动漫网站制作软件下载,十分开心动画为何停播?  JS经典正则表达式笔试题汇总  WordPress 子目录安装中正确处理脚本路径的完整指南  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel如何实现文件上传和存储?(本地与S3配置)  如何确认建站备案号应放置的具体位置?  高端网站建设与定制开发一站式解决方案 中企动力  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Linux系统命令中screen命令详解  Laravel怎么清理缓存_Laravel optimize clear命令详解  高防服务器租用如何选择配置与防御等级?  简单实现Android验证码  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  Angular 表单中正确绑定输入值以确保提交与验证正常工作  详解阿里云nginx服务器多站点的配置  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何在IIS管理器中快速创建并配置网站?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  JavaScript常见的五种数组去重的方式  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  如何快速搭建FTP站点实现文件共享?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  如何选择可靠的免备案建站服务器?  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程