2013-11-21 3 views
2

Мне нужно создать массив массивов в статической памяти, но с разной длиной строк. Я могу вычислить размеры каждой строки во время компиляции, но я не знаю, как ее записать или если это возможно.Создание статического массива массивов различной длины

Любые идеи, пожалуйста? Спасибо заранее ...

+1

Используйте массив указателей. –

+0

Iarsmans: Спасибо, я попробовал это. Но тогда внутри кода я не могу статически распределять память внутри этого массива. Я не могу использовать динамическое распределение, потому что на данный момент у меня нет никакого, а также массив не подходит для стека ... – kolage

ответ

5

Вы не можете иметь массив массивов, потому что массивы могут иметь только один тип элемента, а T[N] и T[M] - это разные типы.

Однако, вы можете иметь массив указателей:

T a0[5], a1[7], a2[21], a3[2]; 

T * arr[] = { a0, a1, a2, a3 }; 

Теперь вы можете использовать arr[0][i] и т.д.

+0

Хорошо, спасибо, это, безусловно, работает, но когда у меня много аки - f.e. k = 20, тогда я должен записать все a0 [...], a1 [...], ..., ak [...], правильно? Есть ли способ создать их с помощью какого-то макроса? – kolage

+0

Мы можем иметь массив массивов, но условие, которое должно быть выполнено, - это размер и тип каждого массива, который должен быть таким же. то есть, если мне это нравится ... "typedef int a [5]; a arr [5]", то arr variable - массив из 5 массивов, каждый массив имеет 5 целых массивов –

2

Вы можете использовать массив указателей, которые вы инициализацию с составными литералов

double* A[] = { 
    (double[]){ init00, init012, [45] = init3, }, 
    (double[]){ init10, init11, init3 }, 
    (double[34]){ 0.0 }, 
}; 

Пока вы можете гарантировать, что инициализаторы и размеры известны во время компиляции, все эти распределения будут выполняться статически. Смешанные литералы не позволяют вам объявлять временные переменные и оглашать пространство имен вашей программы.

+0

Это не работает. clang жалуется: 'указатель инициализируется временным массивом, который будет уничтожен в конце полного выражения'. gcc, похоже, не дает предупреждения, но он все равно должен удерживаться - вы назначаете указатель на массив, но массив не указан, поэтому кажется, что он не будет сохраняться в памяти. – Josh

+0

@ Josh, я не знаю, какая у вас версия clang, но это неправильное поведение. Компонентные литералы, так же как и другие объекты, живут до конца области, в которой они объявлены. Таким образом, здесь они имеют ту же жизнь, что и «А». Единственная трудность с этим была бы в том, что внутри функции, которую вы объявляете 'A', будет' static'. Тогда вы должны иметь ошибку «initializer not constant» или так. –

+0

после дальнейших исследований, я думаю, что вы правы. Это, похоже, согласен с вами: http://www.drdobbs.com/the-new-c-compound-literals/184401404. Я смущен, потому что мне кажется, что мне говорят что-то другое здесь: http://stackoverflow.com/questions/31212114/ – Josh

Смежные вопросы