C++ 创建二维数组,编译时一维未知
有两件事我需要澄清:二维数组和一个数组,其长度在运行时确定。第一个长度未知,第二个已知为两个C++ 创建二维数组,编译时一维未知,c++,multidimensional-array,C++,Multidimensional Array,有两件事我需要澄清:二维数组和一个数组,其长度在运行时确定。第一个长度未知,第二个已知为两个 char** mapping = new char*[2];//2d array mapping[2][0] = 'a'; 由于写入的内存未分配给阵列,此程序崩溃,如何修复?你能解释一下你的答案吗。你需要写: mapping[1] = new char(1); mapping[1][0] = 'a'; 2D数组中的每一行都应该单独初始化,索引从0开始,最大可用索引为1,但您尝试访问第三个1D数组。如
char** mapping = new char*[2];//2d array
mapping[2][0] = 'a';
由于写入的内存未分配给阵列,此程序崩溃,如何修复?你能解释一下你的答案吗。你需要写:
mapping[1] = new char(1);
mapping[1][0] = 'a';
2D数组中的每一行都应该单独初始化,索引从0开始,最大可用索引为1,但您尝试访问第三个1D数组。如果只有第一个数组大小是运行时值(其余是编译时值),则可以一次性分配它。在您的情况下,对于运行时大小
n
char (*mapping)[2] = new char[n][2];
“像往常一样”访问此数组,即作为映射[i][j]
,其中i
在0..n-1
范围内,j
在0..1
范围内
但是,除非您有一些特定的效率/布局要求,否则最好使用
std::vector
这样做,您的所有问题都会消失:
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;
}
在2d数组的意义上,我们需要做的是装箱一个指针数组,并将每个指针指向实际数组的起点。通常我是这样做的
int**ary=newint*[sizeX];对于(int i=0;i
。现在我很好奇它是如何在一行代码中发生的char(*mapping)[2]=newchar[n][2]代码>。请您解释一下,对于其他信息,这是如何发生的。这就是我所做的,但现在我无法确定如何在函数签名中写入返回值,因为n
直到运行时才知道?@Celeritas:什么函数?你必须提供更多关于你想做什么的细节。如果要从函数返回指向此数组的指针(例如,映射
),一种方法是首先键入:typedef Char2[2]
。然后您可以将上述内容重写为Char2*mapping=new Char2[n]
。然后只需使用Char2*
作为函数返回类型,并进行返回映射代码>。(还有其他方法可以typedef
这样做。)不使用typedef
也可以这样做,但函数返回值的语法将非常复杂。@AndreyT我开始了一个新问题