我想知道是否可以使用不同大小的行在C中创建2D数组。
我知道2D数组是一个存储其他数组的数组。但是如果阵列大小不同呢? 像这样的东西(" T"是阵列的可用位置)
0 1 2 3 4
0 T T
1 T T T T T
2 T T T
3 T T T T
如果可能,该怎么做?就像普通的2D阵列一样?
答案 0 :(得分:3)
在C中可以使用不同大小的数组。只是它们不是2D数组而是数组或指针。您可以在C标记常见问题解答中找到有关answer差异的更多信息。
@vahero已经展示了如何动态分配它,但也可以使用静态或自动存储:
char row0[] = "TT"; // size 3 because of the terminating null...
char row1[] = "TTTTT";
char row2[] = "TTT";
char row3[] = "TTTT";
char* array[] = { row0, row1, row2, row3};
或者没有其他变量标识符:
char *arr[] = {
(char[]){ 'T', 'T', 0 },
(char[]){ 'T', 'T', 'T', 'T', 'T', 0 },
(char[]){ 'T', 'T', 'T', 0 },
(char[]){ 'T', 'T', 'T', 'T', 0 },
};
然后你可以像往常一样使用:
for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++) {
for(int j=0; arr[i][j] != '\0'; j++) {
printf("%c ", arr[i][j]);
}
printf("\n");
}
答案 1 :(得分:1)
如果你的意思是你可以声明一个维度有一个可变大小的元素,那么答案是否定的。 C不支持动态大小的结构,因此无法在不扩展最大元素的空间的情况下将它们分配到数组中。但是,有方法和手段。你可以分配一块空间,只使用你需要的东西,效率不高。您可以使用联合来包含各种类型的元素,但具有固定大小。主要的是你在C中有一个固定的步幅值,所以元素都需要符合那个步幅值。那就是数据要进入数组结构。
上述解决方案提出了一种替代解决方案,您的结构存储指向存储在其他位置的数据的指针那不是我的想法,但这是解决问题的方法。您可以存储指向按需分配的数据元素的链接。然后,该数组变得比存储结构更多的索引。我通常在非动态分配的环境中运行,如MISRA。如果我说某些东西必须在“数组”中,我会假设你指的是该对象的已定义内存中的所有数据。所以答案是否定的,如果你愿意允许将数据编入索引...好吧...如果你很高兴有浪费的空间,那么,是的......但是没有包装可变大小的数据元素一个C数组对象。
答案 2 :(得分:0)
我认为你指的是指针指针。 (将来请尝试使用适当的标记标记。您可以通过单击标记进行检查。)
但是!没有什么可以阻止你做的事情:
int **pointerToPointers = malloc(length*sizeof(int *));
pointerToPointers[xUnderLength] = malloc(arbitaryLength*sizeof(int));
答案 3 :(得分:0)
当然你可以创建这样的结构,但你必须确定/保存 每行的列数。例如
size_t cols_per_row [] = { 2, 5, 3, 4 };
int **arr2d = calloc(sizeof cols_per_row / sizeof *cols_per_row, sizeof *arr2d);
for(size_t i = 0; i < sizeof cols_per_row / sizeof *cols_per_row; ++i)
arr2d[i] = calloc(cols_per_row[i], sizeof *arr2d[i]);
我省略了calloc
何时返回NULL
的错误检查,以便用更少的行来证明原则。
请注意,我使用了calloc
而不是malloc
,因为calloc
将内存设置为0,这对初始化很有用。
答案 4 :(得分:0)
IMO最好的解决方案是制作一个以下类型结构的数组:
struct arbitrary_len_arr {
int len;
int* arr;
};
这个实现的美妙之处在于,一旦你让你的2D数组使用这些结构作为每行的指针,你就可以更新你的arr指针,指向你想要的任何数组长度,只要你更新它{ {1}}成员。所以你要做的是:
len
struct arbitrary_len_arr* my_arr = malloc(sizeof(struct arbitrary_len_arr) * N);
是您想要的行数。然后,当你填写它们时,你也必须相应地填写成员,如下:
N
可能在某些循环中。那么你将拥有任意长度的数组。