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; }
额外提示
- 动态分配的内存一定要记得用
delete[]释放,而且要先释放storage再释放array(顺序反过来也可以,但逻辑上先释放底层存储更合理)。 - 如果你的输入是每行一个字符串(比如用户输入"abc"作为一行),可以直接用
cin >> array[i],这样更高效,不过要确保storage的空间足够。 - 新手阶段可以多打印中间值来调试,比如分配完指针后打印
array[i]的地址,看看是否正确指向了storage的对应位置。
内容的提问来源于stack exchange,提问作者parinaz mellatdoust
相关产品推荐
相关产品推荐

