2014-10-26 1 views
2

есть ли удобный способ создания матрицы без использования malloc? Этот вид работ:C 2 мерная матрица с переменными размерами строк

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++:

C++ 2 dimensional array with variable size rows

ответ

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

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

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

+0

То, что я нахожу, беспокоит этот подход, так это то, как размеры являются буквальными числами, которые не являются производными от литерала массива. Это приглашение к ошибкам, забывая изменить размер при изменении литерала массива. Я постараюсь избежать этого, хотя он будет работать нормально. – cmaster

+0

Обнаружилось, что нужно написать m [i] .a [j], есть ли способ избежать этого? – Forss

+1

@Forss Используйте функцию. – 2501

2

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

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