创建用户自定义大小的二维数组编译报错,求解决方法
嘿,这个问题我太熟了!你碰到的是标准C不支持**变长数组(VLA)**的问题——就是你写的int array[row][column];这种用变量指定数组大小的写法,在C标准里是不合法的,只有部分编译器(比如GCC)做了非标准扩展支持,但移植性极差,所以编译器才会报“变量的值不能用作常量”的错误。
下面给你几种标准C++里的靠谱实现方式,全都是可移植的:
方法1:动态分配二维数组(指针的指针)
这种方式需要手动管理内存,记得最后要释放,不然会内存泄漏:
#include <iostream> #include <cstdlib> using namespace std; int main() { int row, column; cout << "Enter the amount of row" << endl; cin >> row; cout << "Enter the amount of column" << endl; cin >> column; // 先分配存储行指针的数组 int** array = new int*[row]; // 再为每一行分配列空间 for (int i = 0; i < row; ++i) { array[i] = new int[column]; } // 示例:给数组赋值并输出 array[0][0] = 10; cout << array[0][0] << endl; // 释放内存:先释放每一行,再释放行指针数组 for (int i = 0; i < row; ++i) { delete[] array[i]; } delete[] array; system("pause"); return 0; }
方法2:用std::vector实现(强烈推荐)
如果用C++标准库的std::vector,就完全不用操心内存管理了,它会自动帮你分配和释放,安全又省心:
#include <iostream> #include <vector> #include <cstdlib> using namespace std; int main() { int row, column; cout << "Enter the amount of row" << endl; cin >> row; cout << "Enter the amount of column" << endl; cin >> column; // 创建二维vector:row行,每行有column个int元素,默认初始值为0 vector<vector<int>> array(row, vector<int>(column)); // 示例使用 array[1][2] = 20; cout << array[1][2] << endl; // 不需要手动释放内存,vector在作用域结束时会自动清理 system("pause"); return 0; }
方法3:一维数组模拟二维数组
要是你不想用指针或者vector,也可以用一维数组来模拟二维结构,通过计算索引来访问元素:
#include <iostream> #include <cstdlib> using namespace std; int main() { int row, column; cout << "Enter the amount of row" << endl; cin >> row; cout << "Enter the amount of column" << endl; cin >> column; // 分配总大小为row*column的一维数组 int* array = new int[row * column]; // 访问原二维数组的array[i][j],对应一维数组的array[i * column + j] array[0 * column + 0] = 30; cout << array[0 * column + 0] << endl; // 释放内存 delete[] array; system("pause"); return 0; }
总的来说,最推荐用std::vector,它是C++标准的一部分,代码简洁还不容易出错。动态分配指针的方式需要仔细处理内存释放,一维数组模拟则要注意索引计算别搞错。
内容的提问来源于stack exchange,提问作者JC YOUNG
相关产品推荐
相关产品推荐

