当前位置: 首页 > news >正文

A函数里调用B函数 ,且往B函数里传了个二级指针,并在B返回后,释放该指针

A函数里调用B函数 ,且往B函数里传了个二级指针,并在B返回后,释放该指针

下面是一个完整的代码示例,演示了函数A调用函数B并传入二级指针,函数B内部分配内存,函数A在B返回后使用并释放该指针。
 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

// 函数B:负责分配内存并初始化数据

// 参数 pp 是一个二级指针,它接收的是函数A中一级指针的地址

void functionB(char** pp) {

    // 通过解引用二级指针pp,我们实际操作的是函数A中的那个一级指针

    // 为其在堆上分配100字节的内存

    *pp = (char*)malloc(100 * sizeof(char));

    

    // 良好的编程习惯:检查内存是否分配成功

    if (*pp == NULL) {

        fprintf(stderr, "Memory allocation failed in functionB.\n");

        return; // 分配失败直接返回

    }

    

    // 向分配的内存中写入数据,这里拷贝一个字符串

    strcpy(*pp, "Hello, this data is allocated in functionB.");

    printf("Inside functionB: Memory allocated and data written.\n");

}

 

// 函数A

void functionA() {

    char* p = NULL; // 在函数A中声明一个一级指针,并初始化为NULL

 

    printf("Inside functionA, before calling functionB:\n");

    printf("Address stored in p: %p\n", (void*)p); // 此时p应为NULL (0x0)

 

    // 调用函数B,并传入指针p的地址(即二级指针&p)

    functionB(&p);

 

    printf("\nInside functionA, after calling functionB:\n");

    if (p != NULL) {

        printf("Address stored in p: %p\n", (void*)p); // 此时p应指向functionB分配的内存

        printf("Data pointed by p: %s\n", p); // 打印p指向的数据

 

        // 使用完毕后,释放functionB分配的内存

        free(p);

        p = NULL; // 将p置为NULL,避免成为野指针

        printf("Memory has been freed in functionA.\n");

    } else {

        printf("Memory allocation in functionB failed, p is still NULL.\n");

    }

}

 

int main() {

    functionA();

    return 0;

}

 

关键点解释

 

为什么用二级指针:在 functionA 中,我们声明了一级指针 p 。为了能让 functionB 改变 p 本身的值(从NULL改为一个有效的内存地址),我们需要将 p 的地址( &p ,类型为 char** )传给 functionB 。这样, functionB 内部的 *pp = malloc(...) 操作实际上是在修改 functionA 中的 p 变量。

 

内存分配与释放:内存是在 functionB 中通过 malloc 分配的,但释放的责任在调用方 functionA 。这是一种常见的模式——分配内存的函数和释放内存的函数应该是同一层级,或者由调用者负责释放,这样可以更好地管理内存生命周期,避免内存泄漏。

 

错误检查:在 functionB 分配内存后和 functionA 使用指针前,都检查了指针是否为 NULL ,这是防止程序崩溃的好习惯。

 

避免野指针:在 functionA 中释放内存后,立即将 p 置为 NULL ,这样可以防止后续误用已经释放的内存。

 

预期输出示例

(具体内存地址每次运行可能不同)

Inside functionA, before calling functionB:
Address stored in p: (nil)
Inside functionB: Memory allocated and data written.

Inside functionA, after calling functionB:
Address stored in p: 0x55a1a2b3c4d0
Data pointed by p: Hello, this data is allocated in functionB.
Memory has been freed in functionA.
 

这个示例清晰地展示了如何使用二级指针在函数间传递动态分配的内存,并确保内存被正确释放。

 

http://www.dtcms.com/a/495281.html

相关文章:

  • 茶社网站开发与设计的开题报告自适应网站好建们
  • 做拍福利爱福利视频网站网站建设与维护实训
  • LangGraph学习笔记(一):langgraph安装
  • DFS算法原理及其模板
  • 【小程序】微信小程序点击效果(view、button、navigator)
  • 快速上手 Scrapy:5 分钟创建一个可扩展的爬虫项目
  • 青岛网站设计公司在哪找网店代运营什么意思
  • 数字图像处理-图像增强(2)
  • JPA 用 List 入参在 @Query中报错 unexpected AST node: {vector}
  • 国外网站顶部菜单设计电子商务 网站设计
  • 南城县建设局网站北京vi设计公司哪
  • spark性能优化1:通过依赖关系重组优化Spark性能:宽窄依赖集中处理实践
  • 工程师的烹饪 - 空气炸锅菜谱
  • 如何在腾讯云上建设网站手机必备网站
  • Linux:12.线程同步与互斥
  • 泰安网站建设哪家强wordpress m1
  • el-table中控制单列内容多行超出省略及tooltip
  • 构建企业级跨境电商(Temu)财务数据自动化采集系统
  • B-tree索引像字典查词一样工作?那哪些数据库查询它能加速,哪些不能?
  • C++实现二叉树搜索树
  • 网站开发和美工的区别手机域名注册被骗
  • 做模特的网站python语言编程入门
  • GeeLark 9月功能更新回顾
  • C++---ref-qualifier( / )函数的左右值调用的界定
  • vue3:数组的.includes方法怎么使用
  • 网站建设及网页设计企业宣传片公司
  • 132.MIG IP核中没有512M16的只有512M8的如何解决
  • SwiftUI 布局之美:Padding 让界面呼吸感拉满
  • RHCSA-08文本处理工具
  • JSP XML 数据处理