C/C++中是否存在锯齿状数组?

unk*_*own 28 c c++ jagged-arrays

在C或C++中是否存在锯齿状数组?

当我编译这个:

int jagged[][] = { {0,1}, {1,2,3} };
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

错误:声明`jagged'作为多维数组必须具有除第一个之外的所有维度的边界

Cro*_*ent 24

在CI中将使用指针数组.

例如:

int *jagged[5];

jagged[0] = malloc(sizeof(int) * 10);
jagged[1] = malloc(sizeof(int) * 3);
Run Code Online (Sandbox Code Playgroud)

等等


ram*_*ion 16

有很多方法可以做到这一点.这是另一种方式:

int jagged_row0[] = {0,1};
int jagged_row1[] = {1,2,3};
int *jagged[] = { jagged_row0, jagged_row1 };
Run Code Online (Sandbox Code Playgroud)

  • +1.这是C99的复合文字显示的地方:`int*jagged [] = {(int []){0,1},(int []){1,2,3}};`也不是那么好吗? (5认同)
  • 这个解决方案的问题在于子数组会立即衰减为指针,因此您无法知道边界是什么. (4认同)
  • @Christoph Guardian值对于数字数组可能有问题,因为可能没有允许的"特殊"值.我认为以某种方式明确地存储数组维度是更好的做法. (3认同)

小智 14

如果你只想初始化它,你可以说:

int jagged[][3] = { {0,1}, {1,2,3} };
Run Code Online (Sandbox Code Playgroud)

但阵列仍将具有形状[2] [3].如果你想要一个真正的锯齿状数组,你将不得不动态创建它.如果你这样做,并且正在使用C++,你应该使用a std::vector,如friol建议的那样.


Gab*_*ona 12

C++中(未编译,可能还有更紧凑的语法):

std::vector<std::vector<int> > myArray;

myArray.push_back(std::vector<int>());
myArray.push_back(std::vector<int>());

myArray[0].push_back(0);
myArray[0].push_back(1);

myArray[1].push_back(1);
myArray[1].push_back(2);
myArray[1].push_back(3);
Run Code Online (Sandbox Code Playgroud)

所以现在你可以使用例如myArray [0] [0]等来访问元素.