C 2-мерный массив со строками переменного размера

есть ли удобный способ создать матрицу без использования 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 для arr2d[3][3].

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

Есть ли лучший способ сделать это?

Для справки, вот такой же вопрос для C++:

2-мерный массив C++ со строками переменного размера


person Forss    schedule 26.10.2014    source источник


Ответы (2)


Использование структур и составных литералов возможно только в стеке.

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

Это имеет ограничения. При копировании структуры сами массивы не копируются.

Отдельные функции и макросы могли бы помочь справиться с этим, но это не так красиво.

person 2501    schedule 26.10.2014
comment
Что меня беспокоит в этом подходе, так это то, что размеры являются буквальными числами, которые не являются производными от литерала массива. Это приглашение к ошибкам, если вы забудете изменить размер при изменении литерала массива. Я бы постарался избежать этого, хотя это сработает нормально. - person cmaster - reinstate monica; 26.10.2014
comment
Найдено в громоздком, чтобы написать m[i].a[j], есть ли способ избежать этого? - person Forss; 26.10.2014
comment
@Forss Используйте функцию. - person 2501; 26.10.2014
comment
Объединить этот ответ с dasblinkenlight и не использовать структуру кажется проще. size_t len[] = { 1, 2, 3 }; int *arr2d[] = { (int[]){0}, (int[]){0, 1}, (int[]){0, 1, 2} }; - person Forss; 26.10.2014

Вы не можете этого сделать: в этом случае sizeof оценивается статически и представляет собой размер указателя. Если вам нужно реализовать зубчатый массив с разными размерами для каждой строки, у вас есть два варианта:

  • Когда размер можно вычислить из индекса строки, например. в "треугольном" массиве, таком как ваш (длина массива row+1), вы вообще ничего не храните
  • Если размер произвольный, создайте отдельный массив size_t len[rows] и сохраните каждую длину отдельно.
person Sergey Kalinichenko    schedule 26.10.2014