You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++代码打印*pointer时出现内存错误:原因分析及修复方法

问题原因分析
  • 指针参数传递错误:get_progress函数的参数int* int_get_progress是值传递,函数内修改的只是该参数的局部副本,全局变量int_get_progress完全没被更新。main函数里依然解引用初始的空指针0,直接触发内存访问错误。
  • 局部变量生命周期问题:就算参数传递正确,让指针指向函数内的局部变量n,函数执行完毕后局部变量的栈内存会被释放,后续访问该指针会变成野指针,同样会导致未定义行为。
修复方案

提供几种实用的修复方式:

方式一:使用指针的指针(修改全局指针)

将函数参数改为指针的指针,以此真正修改全局指针变量,同时把进度变量设为静态,避免生命周期问题:

#include <iostream>
int* int_get_progress = 0;

void get_progress(int** int_get_progress)
{
    static int n = 100; // 静态变量生命周期与程序一致
    *int_get_progress = &n;
    std::cout << "get_report_progress:" << **int_get_progress << std::endl;
}

int main()
{
  get_progress(&int_get_progress);
  std::cout << "main get process:" << *int_get_progress << std::endl;
  return 0;
}

方式二:使用指针引用(更简洁的C++风格)

利用C++的引用特性,直接传递指针的引用,配合静态变量解决生命周期问题:

#include <iostream>
int* int_get_progress = 0;

void get_progress(int*& int_get_progress) // 指针的引用
{
    static int n = 100;
    int_get_progress = &n;
    std::cout << "get_report_progress:" << *int_get_progress << std::endl;
}

int main()
{
  get_progress(int_get_progress);
  std::cout << "main get process:" << *int_get_progress << std::endl;
  return 0;
}

方式三:直接使用全局变量存进度(最省心的方案)

如果进度是动态更新的场景,直接用全局变量存储进度值,无需折腾指针:

#include <iostream>
int progress = 0; // 全局变量存进度

void get_progress()
{
    progress = 100; // 更新进度值
    std::cout << "get_report_progress:" << progress << std::endl;
}

int main()
{
  get_progress();
  std::cout << "main get process:" << progress << std::endl;
  return 0;
}

内容的提问来源于stack exchange,提问作者Nick Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:25:28