您可以通过创建一个指针数组来做到这一点。在这种情况下,锯齿状数组的元素不一定是连续存储的,并且必须以某种方式保持各个行的长度,以便可以使用锯齿状数组。
如果数组类型允许,另一种选择是使用二维数组,将每行的大小存储在每行的第一个元素中。这可能会比指针数组使用更多的内存,但元素将连续存储在内存中。
如果有一个值不能出现在数组中,可以使用标记值而不是显式存储行大小。即使数组的类型不允许存储大小值(例如,char[][]),也可以使用它。
#include <stdio.h>
#include <string.h>
int main(void)
{
/* Jagged array using pointers */
int array_1[] = { 1, 2, 3 };
int array_2[] = { 5, 6 };
int array_3[] = { 7, 8, 9, 10 };
int *jagged_array_1[] = { array_1, array_2, array_3 };
size_t array_sizes[] = { sizeof array_1 / sizeof *array_1,
sizeof array_2 / sizeof *array_2,
sizeof array_3 / sizeof *array_3 };
for (size_t i = 0; i < 3; i++) {
for (size_t j = 0; j < array_sizes[i]; j++) {
printf("%4d", jagged_array_1[i][j]);
}
putchar('\n');
}
putchar('\n');
/* Using the first element to store sizes */
int jagged_array_2[3][5] = { { 0 } };
jagged_array_2[0][0] = sizeof array_1 / sizeof *array_1;
memcpy(&jagged_array_2[0][1], array_1, sizeof array_1);
jagged_array_2[1][0] = sizeof array_2 / sizeof *array_2;
memcpy(&jagged_array_2[1][1], array_2, sizeof array_2);
jagged_array_2[2][0] = sizeof array_3 / sizeof *array_3;
memcpy(&jagged_array_2[2][1], array_3, sizeof array_3);
for (int m = 0; m < 3; m++) {
for (int n = 0; n < jagged_array_2[m][0]; n++) {
printf("%4d", jagged_array_2[m][n+1]);
}
putchar('\n');
}
putchar('\n');
/* Using a sentinel element */
int jagged_array_3[3][5] = { { 0 } };
memcpy(jagged_array_3[0], array_1, sizeof array_1);
jagged_array_3[0][sizeof array_1 / sizeof *array_1] = -1;
memcpy(jagged_array_3[1], array_2, sizeof array_2);
jagged_array_3[1][sizeof array_2 / sizeof *array_2] = -1;
memcpy(jagged_array_3[2], array_3, sizeof array_3);
jagged_array_3[2][sizeof array_3 / sizeof *array_3] = -1;
for (size_t i = 0; i < 3; i++) {
for (size_t j = 0; jagged_array_3[i][j] != -1; j++) {
printf("%4d", jagged_array_3[i][j]);
}
putchar('\n');
}
putchar('\n');
return 0;
}