【发布时间】:2013-05-09 07:05:51
【问题描述】:
我需要澄清两件事:二维数组和一个长度在运行时确定的数组。第一个长度未知,第二个已知为二。
char** mapping = new char*[2];//2d array
mapping[2][0] = 'a';
由于写入的内存未分配给数组,该程序崩溃,我该如何解决?你能解释一下你的答案吗?
【问题讨论】:
标签: c++ multidimensional-array
我需要澄清两件事:二维数组和一个长度在运行时确定的数组。第一个长度未知,第二个已知为二。
char** mapping = new char*[2];//2d array
mapping[2][0] = 'a';
由于写入的内存未分配给数组,该程序崩溃,我该如何解决?你能解释一下你的答案吗?
【问题讨论】:
标签: c++ multidimensional-array
如果只有第一个数组大小是运行时值(其余的是编译时值),那么您可以一次性分配它。在您的情况下,对于运行时大小 n
char (*mapping)[2] = new char[n][2];
“照常”访问此数组,即mapping[i][j],其中i 在0..n-1 范围内,j 在0..1 范围内。
但是,除非您有一些特定的效率/布局要求,否则最好使用std::vector。
【讨论】:
int** ary = new int*[sizeX];for(int i = 0; i < sizeX; ++i) {ary[i] = new int[sizeY];}。现在我很好奇它是如何在一行代码char (*mapping)[2] = new char[n][2]; 中发生的。您能否解释一下,其他信息是如何发生的。
n 直到运行时才知道?
mapping),一种方法是先到typedef类型:typedef char Char2[2]。然后你可以将上面的内容重写为Char2 *mapping = new Char2[n]。然后只需使用Char2 * 作为函数返回类型并执行return mapping;。 (typedef 这个还有其他方法。)没有typedef 也可以,但是函数返回值的语法会很复杂。
你需要写:
mapping[1] = new char(1);
mapping[1][0] = 'a';
二维数组中的每一行都应单独初始化,索引从 0 开始,最大可用索引为 1,但您尝试访问第三个一维数组。
【讨论】:
只要这样做,你所有的问题都会消失:
int size_x = 10, size_y = 20;
char* arr = new char[size_x*size_y];
char get(int x, int y) {
return arr[x+y*size_x];
}
void set(int x, int y, char val) {
arr[x+y*size_x]=val;
}
【讨论】: