Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建二维数组,编译时一维未知_C++_Multidimensional Array - Fatal编程技术网

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我开始了一个新问题