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; }
代码说明
- 用
*arr_str = new unsigned int *[len]替代原有的arr_str = ...,让main中的array_string指向新分配的指针数组。 - 新增数组元素初始化和内存释放逻辑,避免未定义行为和内存泄漏。
- 如果不需要给每个指针分配具体内存,至少可以把指针初始化为
nullptr,避免后续访问野指针。
内容的提问来源于stack exchange,提问作者Himanshu Dutta
相关产品推荐
相关产品推荐

