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

C++新手指针使用问题:动态二维字符数组代码报错求助

修复你的二维字符数组输入代码

嘿,作为指针新手踩这种类型匹配的坑太正常啦,我帮你把代码里的问题一个个揪出来,再给你修正后的版本:

代码里的核心错误

  • 类型完全不匹配:你声明的array是char**(指向char指针的指针),但分配内存时写了new *int[rows]——这不仅语法错了(正确的动态分配数组语法是new 类型[数量]),类型也不对,应该分配char*类型的数组,而不是int相关的。
  • 存储数组类型错误:storage你声明成了int*,但我们要存储的是char类型的字符,用int数组存会导致类型不匹配,输入字符的时候也会出问题。
  • 变量重复声明(非致命但易混淆):你已经在开头声明了i,j,后面第一个for循环又写了int i=0,虽然C++允许,但容易搞混变量作用域,建议统一写法。

修正后的完整代码

#include <iostream>
using namespace std;

int main() {
    int rows, col; 
    char **array; 
    char *storage; 

    // 获取行数和列数
    cin >> rows >> col; 

    // 分配指向char指针的数组(对应每行的指针)
    array = new char*[rows]; 
    // 分配连续的字符存储空间,用来存整个二维数组的内容
    storage = new char[rows * col]; 

    // 给每行指针绑定到对应存储空间的起始位置
    for (int i = 0; i < rows; ++i) {
        array[i] = storage + col * i; 
    }

    // 输入二维字符数组的内容
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < col; ++j) {
            cin >> array[i][j];
        }
    }

    // 可以加个测试输出,验证输入是否正确
    cout << "你输入的二维数组是:" << endl;
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < col; ++j) {
            cout << array[i][j] << " ";
        }
        cout << endl;
    }

    // 别忘了释放动态分配的内存!避免内存泄漏
    delete[] storage;
    delete[] array;

    return 0;
}

额外提示

  1. 动态分配的内存一定要记得用delete[]释放,而且要先释放storage再释放array(顺序反过来也可以,但逻辑上先释放底层存储更合理)。
  2. 如果你的输入是每行一个字符串(比如用户输入"abc"作为一行),可以直接用cin >> array[i],这样更高效,不过要确保storage的空间足够。
  3. 新手阶段可以多打印中间值来调试,比如分配完指针后打印array[i]的地址,看看是否正确指向了storage的对应位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:21:31