E43.【C语言】练习:传址调用

1.问题

阅读下列代码,在Function函数返回前,px的值会因malloc的返回值而发生改变吗?

cpp 复制代码
#include <stdlib.h>
void Function(int* ptr)
{
	ptr = (int*)malloc(sizeof(int));
}

int main()
{
	int* px = NULL;
	Function(px);
	return 0;
}

2.分析

VS2022进入调试模式,下断点在return 0;处,打开监视窗口

注意到px仍然为空,Function函数返回后,ptr被销毁,空间无法释放

有些人会错误认为:传址调用只要传了地址(Function(px)中,px为int*类型,地址为NULL)可以实现改变px,其实不对

如果为变量类型为int*,则要传int***变量的地址(Function(&px)),则在Function函数中耀以二级指针int****来接收,解引用时才能改变px

因此正确代码为

cpp 复制代码
#include <stdlib.h>
void Function(int** ptr)
{
	*ptr = (int*)malloc(sizeof(int));
}

int main()
{
	int* px = NULL;
	Function(&px);
	free(px);
	return 0;
}

这样free(px);起了作用

总结:改变int类型的变量.传int*参数;改变int*类型的变量.传int**参数;......

相关推荐
code bean4 分钟前
【LangChain】检索器完全指南:从向量检索到生产级 RAG 架构
java·开发语言·微服务
LabVIEW开发24 分钟前
LabVIEW + MATLAB 混合编程:爆炸场测试数据精准采集方案
开发语言·matlab·labview
嵌入式协会202407224 分钟前
(已解决)MinIO python 获取预签名出现forbidden、errornetwork等错误
java·开发语言·python
宸丶一31 分钟前
Day 14:任务追踪 - 让 Agent 拥有项目管理能力
开发语言·python
小短腿的代码世界40 分钟前
Qt行情协议解析与二进制编解码优化:从FIX到自定义协议的全链路架构
开发语言·qt·架构
努力小周1 小时前
STM32智能安防系统
c语言·stm32·单片机·嵌入式硬件·物联网·计算机网络·pcb工艺
skylar01 小时前
小白1分钟安装flash-attn
开发语言·python
默子昂1 小时前
ollama 自定义ui
开发语言·python·ui
赴生-2 小时前
C++进阶 C++11(下)
开发语言·c++
赴生-3 小时前
C++进阶 异常
开发语言·c++