具有可变大小行的C 2维数组

具有可变大小行的C 2维数组,c,multidimensional-array,local-variables,C,Multidimensional Array,Local Variables,有没有不使用malloc创建矩阵的方便方法?这类作品: int *arr2d[3]; int arr0[] = { 0 }; int arr1[] = { 0, 1 }; int arr2[] = { 0, 1, 2 }; arr2d[0] = arr0; arr2d[1] = arr1; arr2d[2] = arr2; printf(%d, arr2d[i][j]); 它不允许您轻松地循环遍历这些值,因为您无法获得每个子阵列的大小,就像使用sizeof for arr2d[3][3]一

有没有不使用malloc创建矩阵的方便方法?这类作品:

int *arr2d[3];
int arr0[] = { 0 };
int arr1[] = { 0, 1 };
int arr2[] = { 0, 1, 2 };

arr2d[0] = arr0;
arr2d[1] = arr1;
arr2d[2] = arr2;

printf(%d, arr2d[i][j]);
它不允许您轻松地循环遍历这些值,因为您无法获得每个子阵列的大小,就像使用sizeof for arr2d[3][3]一样

sizeof arr2d[i] / sizeof arr2d[i][0]
有没有更好的办法

作为参考,这里有一个与C++相同的问题:


您不能这样做:在这种情况下,
sizeof
是静态计算的,它表示指针的大小。如果需要实现每行大小不同的锯齿阵列,则有两个选项:

  • 当可以从行索引计算大小时,例如在像您这样的“三角形”数组中(数组长度为
    row+1
    ),您根本不存储任何内容
  • 如果大小是任意的,请创建一个单独的数组
    大小\u t len[行]
    ,并分别存储每个长度

只能在堆栈上使用结构和复合文字

typedef struct
{
    size_t size ;
    int* a ;

} jag_array ;

jag_array m[] = { { 3 , ( int[] ){ 1,2,3 } } , 
                    6 , ( int[] ){ 1,2,3,4,5,6 } ,  
                    4 ,( int[] ){ 1,2,3,4 } } ;
这有局限性。复制结构时,不会复制阵列本身


单独的函数和宏可能有助于处理这个问题,但它并没有那么漂亮。

我发现这种方法的问题在于大小是如何从数组文字中派生出来的文字数字。这是由于在更改数组文字时忘记修改大小而导致的错误。我会尽量避免这种情况,尽管它会很好地工作。我发现写m[I].a[j]很麻烦,有没有办法避免这种情况?@Forss使用函数。将此答案与DasbLinkedLight结合起来,而不使用结构会让人觉得更简单<代码>大小长度[]={1,2,3};int*arr2d[]={(int[]){0},(int[]){0,1},(int[]){0,1,2}