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

收工!

posted @   yuzuki_n  阅读(127)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示