c++ 踩坑记录,如何正确的对指针参数new空间
问题
将指针传入函数,在函数中为指针new
一块空间,发现函数中指针发生改变,但原指针未变化。
代码:
#include <iostream>
void foo(int* a)
{
a = new int(1);
std::cout << "a = " << *a <<"\n";
}
int main()
{
int* p = nullptr;
foo(p);
std::cout << "p = " << *p;
}
输出结果(g++下)
a = 1
Segmentation fault
为什么会产生这个问题,如何解决这个问题
如果我们传入的p是一个int
型变量,那么a
只是p
的一个副本,想要通过改变a
来改变p
,我们就需要传入a
的地址,直接修改这个地址中的内容,也就是所谓的穿指针,再通过指针修改变量。类比发现,那我们想通过函数修改指针变量,也应该传入这个指针的地址,也就是所谓的指向指针的指针。
所以代码应该改为下面这样子
#include <iostream>
void foo(int** a)
{
*a = new int(10);
std::cout << "a = " << **a <<"\n";
}
int main()
{
int* p = nullptr;
foo(&p);
std::cout << "p = " << *p;
}
收工!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!