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

C++通过指针打印动态分配二维数组出现垃圾值的原因

问题根因
  • 内存布局不兼容
    你定义的int** array是指针数组,4个行指针分别指向独立申请的4个int数组,行与行之间内存不连续,且array存储的是行指针的地址。而int (*ptr)[4][4]是指向连续存储的4×4二维数组的指针,要求16个int元素连续排布,你强制将*array(第一行首地址)转换为该类型属于非法类型转换,触发未定义行为,这是出现垃圾值的核心原因。
  • 运算符优先级错误
    []的优先级高于*,你写的*ptr[i][j]实际执行逻辑是*(ptr[i][j]):先将ptr偏移i个4×4数组的长度,再偏移j个长度为4的int数组的长度,最后解引用,完全不符合你要访问第i行第j列的预期。
修复方案

方案一:适配原有指针数组的内存结构,修改ptr类型

将ptr改为指向长度为4的int数组的指针,匹配每行的内存结构:

#include <iostream>
using namespace std;
int main() {
    int (*ptr)[4];
    int** array;
    array = new int*[4];
    for (int i = 0; i < 4; i++) {
        array[i] = new int[4];
    }
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            array[i][j] = 1;
        }
    }
    for (int i = 0; i < 4; i++) {
        ptr = array[i];
        for (int j = 0; j < 4; ++j) {
            cout << "Val " << ptr[j] << " And index " << i << " and " << j << endl;
        }
    }
    // 释放内存避免泄漏
    for (int i = 0; i < 4; i++) {
        delete[] array[i];
    }
    delete[] array;
    return 0;
}

方案二:保留原ptr类型,申请连续的二维数组内存

如果要使用int (*ptr)[4][4]类型,需要直接申请连续的16个int内存空间,匹配指针要求的内存布局:

#include <iostream>
using namespace std;
int main() {
    int (*ptr)[4][4];
    // 申请连续的4×4 int内存
    ptr = new int[1][4][4];
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; j++) {
            // 调整优先级,先解引用ptr再取下标
            (*ptr)[i][j] = 1;
        }
    }
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 4; ++j) {
            cout << "Val " << (*ptr)[i][j] << " And index " << i << " and " << j << endl;
        }
    }
    delete[] ptr;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:39:00