c/c++子函数内使用malloc或者new申请一块内存供外部使用

2023-05-16

当指针作为函数的形参时,不要用该指针去申请动态内存。网上有下面的例子:

void GetMemory(char *p, int num)
{
    p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(str, 100); // str 仍然为 NULL
    strcpy(str, "hello"); // 运行错误
}

在实际应用中,笔者编写了类似的例子,用形参指针去调用malloc函数,使用gcc编译,编译时不会报错,但是运行时会报段错误,产生段错误的因素很多,但本次运行的段错误确实跟形参指针调用malloc函数有关,当然也不是说形参指针不能调用malloc函数去申请动态内存,只是不能使用上述例子中的方式。

c语言中函数参数传递都是值传递,值传递分为数值传递和指针传递,因此指针传递也是一次赋值拷贝的过程。对于传入的指针参

数 p 来说,编译器会为该参数创建一个临时副本,例如 _p。函数体中只是修改了形参_p的内容,对于实参p没有任何影响。

如果想要在调用函数中申请内存,笔者在网上找到了两种方式:

1. 双重指针

void GetMemory(char **p, int num)
{
    *p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(&str, 100); //注意是&str
    strcpy(str, "hello");
     free(str);
}

2.参数返回申请的内存

char * GetMemory( int num)
{
    char *p = (char *)malloc(sizeof(char) * num);
     return p;
}
void Test(void)
{
    char *str = NULL;
    str = GetMemory(100); //注意是&str
    strcpy(str, "hello");
     free(str);
}

3. 结合c++的引用

总体测试如下:

//一级指针,失败
void test0(float* p)
{
    p = (float*)malloc(sizeof(float));
    *p = 6.6;
}

// 二级指针成功
void test1(float** p)
{
    *p = (float*)malloc(sizeof(float));
    **p = 3.14;
}

// 返回指针成功
float* test2()
{
    float*p = (float*)malloc(sizeof(float));
    *p = 4.14;
    return p;
}
// 结合c++的引用成功
void test3(float*& p)
{
    p = (float*)malloc(sizeof(float));
    *p = 5.14;
}

int main(){

    float a = 3.3;
    float* p0 = &a;
    test0(p0);
    printf("*p0 = %f\n", *p0);
    free(p0);

    float* p1 = nullptr;
    test1(&p1);
    printf("*p1 = %f\n", *p1);
    free(p1);

    float* p2 = nullptr;
    p2 = test2();
    printf("*p2 = %f\n",*p2);
    free(p2);

    float* p3 = nullptr;
    test3(p3);
    printf("*p3 = %f\n", *p3);
    free(p3);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c/c++子函数内使用malloc或者new申请一块内存供外部使用 的相关文章

  • 【对比实验的坑】

    图像处理对比算法是踩过的坑 1 首当其冲 xff1a 保存数据的格式 其他人的算法 xff0c 即便公开了代码 xff0c 大概率也得再做调整 xff0c 或者配置环境 他们保存数据的方式并不是适合求取误差或者跟自己算法相同colormap
  • STM32F4 UART基础(HAL库)

    文章目录 概述 96 UART 96 初始化 96 UART 96 参数初始化 96 UART 96 句柄 96 UART 96 初始化结构体 96 UART 96 参数初始化函数 96 UART 96 时钟初始化 96 UART GPIO
  • 【GCC】通过参数-fno-elide-constructors关闭g++的编译优化

    变量定义成 volatile xff0c 避免优化掉 原文 xff1a https blog csdn net songguangfan article details 89049612 前两天在做讲课资料的时候遇到一个比较坑的问题 一般来
  • 【Jmeter】Jmeter压力测试工具安装及使用教程(redis测试)

    摘自 xff1a https www cnblogs com monjeo p 9330464 html 一 Jmeter下载 进入官网 xff1a http jmeter apache org 1 第一步进入官网如下图 2 选择进行下载
  • 【数据库】Redis和RocksDB、levelDB的区别

    区别 Redis 是一个服务 xff0c 独立的进程 xff0c 用户的程序需要与它建立连接才能向它发请求 xff0c 读写数据 RocksDB 和LevelDB 是一个库 xff0c 嵌入在用户的程序中 xff0c 用户程序直接调用接口读
  • Kerloud VTOL垂直起降固定翼飞机发布

    产品简介 垂直起降 xff08 VTOL Vertical Take off and Landing xff09 固定翼无人机具备独特的构型 xff0c 凭借自身起降方便 续航持久等优势 xff0c 成为近年来在军事 工业 农业等领域中最具
  • 【Linux】用户和用户组|将用户添加到root组中

    添加组 usermod a G root dev 修改dec的用户组为root usermod g root dec 删除组用户dev的用户组root gpasswd d dev root 将用户dev加入到root组 gpasswd a
  • 【ethtool】ethtool 网卡诊断、调整工具、网卡性能优化| 解决丢包严重

    目录 即看即用 详细信息 软件简介 安装 ethtool的使用 输出详解 其他指令 将 ethtool 设置永久保存 如何使用 ethtool 优化 Linux 虚拟机网卡性能 ethtool 解决网卡丢包严重和网卡原理 即看即用 查看 x
  • 【C++】undefined reference to找不到符号问题汇总及解决方法

    目录 1 链接时缺失了相关目标文件 o 2 链接时缺少相关的库文件 a so 3 链接的库文件中又使用了另一个库文件 4 多个库文件链接顺序问题 5 定义与实现不一致 6 在c 43 43 代码中链接c语言的库 7 C 43 43 中类中静
  • 【SNMP】snmp trap 介绍、安装、命令|Trap的发送与接收代码实现

    目录 零 简略 一 SNMP简单概述 1 1 什么是Snmp 1 2 为什么需要SNMP xff1f 1 3 SNMP的基本组件 1 4 SNMP 和 UDP 1 5 Snmp版本 二 Snmp有关的基本概念 2 1 代理和管理站的模型 2
  • 【MYSQL】同时查询两个表并将结果合并到一起

    目录 从两个表中查不同字段并拼接到一起 从两个表中查的字段不一样 将两个表结果合并 从两个表中查的字段一样 SQL多表合并UNION ALL和UNION 从两个表中查不同字段并拼接到一起 从两个表中查的字段不一样 SELECT 表1 字段1
  • 【TCP/IP】TCP/IP 四层协议|四层/五层/OSI七层协议

    目录 前言 五层协议模型 四层 gt 五层 gt 七层协议模型 四层 gt 五层 gt 七层协议 4层的是TCP IP模型 xff0c 7层的是OSI模型 五层 七层协议 前言 本文持续更新 地址 xff1a http t csdn cn
  • 【MSP430中断】MSP430的IO口中断/中断特性|Px中断进不去 原因

    目录 MSP430学习笔记之七 xff1a IO口中断 端口中断进不去 Px中断进不去 原因 MSP430学习笔记之七 xff1a IO口中断 MSP430中断嵌套机制 1 430默认的是关闭中断嵌套的 xff0c 除非你在一个中断程序中再
  • 【IAR 】MSP430 IAR 编译报错:error

    关于转载的说明 xff1a 原文内容可能会不断更新 xff0c 要想得到最新的内容请跳到到原文看 无编号警告类型 xff1a 1 Sat Jun 23 2012 17 41 05 The stack pointer for stack 39
  • 【物联网】AT指令|AT返回错误|AT 指令 收发短信和GPRS上网 SIM508/548

    目录 常用AT命令解释 AT 指令 收发短信和GPRS上网 SIM508 548 AT指令返回错误 解释 CME错误 xff1a CMS错误 CME错误 英文 CMS 错误 英文 短信通信的几种情况和CMS错误 常用AT命令解释 一 AT命
  • DASA异构机器人集群科技教育方案

    DASA异构机器人集群科技教育方案 愿景主要特征基础设施完善室内室外全局定位软件接口兼容统一虚拟仿真快速验证演示程序详细讲解 功能展示无人机集群仿真异构机器人自主飞行 更多信息 愿景 近年来 xff0c 中国已成为各类机器人应用增长最快的国
  • STM32 系列使用知识问题笔记

    STMF103用了这么多年 xff0c 项目也做过不少 xff0c 当然也遇到过很多问题 xff0c 虽然现在使用起来也算得上得心应手 xff0c 但是有些地方还是用起来还是得查查看看 xff0c 所以就专门开设一篇文章 xff0c 放一些
  • STM32的内存管理相关(内存架构,内存管理,map文件分析)

    把以前看过的做过的笔记 xff0c 还有网上参考的部分好文章 xff0c 利用十一假期好好梳理了一遍 xff0c 希望对大家也对自己以后查看有帮助 梳理章节架构 xff0c 完善内容 2021 10 6 2021 10 7 5 1 STM3
  • FreeRTOS记录(四、FreeRTOS任务堆栈溢出问题和临界区)

    本来计划是消息队列 信号量 任务通知 事件集 邮件的文章 但是因为自己调试的时候遇到了一个问题 xff0c 还是把堆栈溢出问题放到前面来说 增加临界区的使用说明 2021 11 7 临界区的使用部分增加任务挂起与临界区说明 2021 11
  • C++存储类

    存储类定义C 43 43 程序中变量 函数的范围 xff08 可见性 xff09 和生命周期 这些说明符放置在它们所修饰的类型之前 下面列出C 43 43 程序中可用的存储类 xff1a autoregisterstaticexternmu

随机推荐