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

时间:2014-10-26 18:57:57

标签: 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]。

sizeof arr2d[i] / sizeof arr2d[i][0]

有没有更好的方法呢?

供参考,以下是与C ++相同的问题:

C++ 2 dimensional array with variable size rows

2 个答案:

答案 0 :(得分:2)

你不能这样做:在这种情况下,sizeof被静态评估,它代表指针的大小。如果需要实现每行不同大小的锯齿状数组,则有两种选择:

  • 当可以从行索引计算大小时,例如,在"三角形"像你这样的数组(数组长度为row+1)你根本不存储任何东西
  • 当大小是任意的时,创建一个单独的数组size_t len[rows],并单独存储每个长度。

答案 1 :(得分:1)

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

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 } } ;

这有局限性。复制结构时,不会复制数组本身。

单独的函数和宏可以帮助处理这个,但它不是那么漂亮。