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

C++二维unsigned int指针数组分配异常:运行输出全0求助

问题排查:unsigned int指针数组内存分配导致输出全0的原因与解决方法

问题原因

核心错误是函数内修改了形参arr_str本身,而非它指向的内存地址:

  • 你传入的&array_string是main中指针变量的地址,函数里的arr_str是这个地址的副本。直接执行arr_str = new unsigned int *[len],只是修改了副本的指向,完全不会影响main里的array_string。
  • 你输出的arr_str[i]是新分配的指针数组里的元素,这些元素未初始化,值是随机的(你这里输出全0是编译器的巧合行为)。而且函数结束后,这块新分配的内存会丢失,造成内存泄漏。

解决方法

要修改**arr_str指向的目标**,也就是用*arr_str来接收新分配的数组地址,这样才能把分配结果同步回main函数。

修正后的代码

#include <iostream>
#include <cstdlib>
using namespace std;

void function_manipulate(unsigned int **arr_str, unsigned int *arr_len)
{
    *arr_len = 3;
    int len = *arr_len;

    // 关键:给arr_str指向的变量(即main里的array_string)赋值
    *arr_str = new unsigned int *[len];

    // 初始化数组元素,避免随机值
    for (int i = 0; i < len; i++)
    {
        // 示例:给每个指针分配内存并赋值
        (*arr_str)[i] = new unsigned int(i + 1);
        cout << *(*arr_str)[i] << '\n';
    }
}

int main()
{
    unsigned int *array_string = NULL;
    unsigned int array_length = 0;
    
    function_manipulate(&array_string, &array_length);

    // 释放内存,避免泄漏
    for (int i = 0; i < array_length; i++)
    {
        delete array_string[i];
    }
    delete[] array_string;
}

代码说明

  1. 用*arr_str = new unsigned int *[len]替代原有的arr_str = ...,让main中的array_string指向新分配的指针数组。
  2. 新增数组元素初始化和内存释放逻辑,避免未定义行为和内存泄漏。
  3. 如果不需要给每个指针分配具体内存,至少可以把指针初始化为nullptr,避免后续访问野指针。

内容的提问来源于stack exchange,提问作者Himanshu Dutta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:22:25