2014-06-25 4 views
0

Я собираюсь иметь массив массивов в c, поскольку каждый массив в основном массиве имеет определенный размер. Например: { {а, Ь, с}, {а}, {a, d}} Проблема Я не хочу использовать кучу памяти и использовать "таНос", также он должен не быть потерянной памятью. Например, я не хочу использовать следующий код:Как создать массив массивов разных размеров в c?

char myArrays[][3] = { 
{a,b,c}, 
{a,null,null}, 
{a,d,null} 
} 
+0

Проверьте этот вопрос и ответы http://stackoverflow.com/questions/22745750/array-of-arrays-with-different-sizes ?? – pes502

+0

3 байта не тратит впустую память ... У вас мало памяти в вашем фактическом проекте или это довольно теоретический вопрос? – mafso

+0

Задайте вопросы, что должно быть b c d null и т. Д., И добавьте контекст вашей проблемы. – Yann

ответ

5

Если вы хотите создать массив массивов различных размеров, что вам нужно сделать массив указателей, например:

char *myArrays[] = { 
    (char[]){'a','b','c'}, 
    (char[]){'a'}, 
    (char[]){'a','d'} 
}; 

Вам не нужно «заполнять» свои массивы нулевыми символами.

Обратите внимание, что этот подход не обеспечивает простой способ определения точной длины внутренних массивов: оператор sizeof не собирается работать. Если вы хотите знать длину внутренних массивов, либо добавить согласующие элементы некоторого вида (скажем, '\0') или добавить массив длины, например:

size_t myLengths[] = {3, 1, 2}; 

Теперь вы можете перебирать массив массивов как это:

for (int i = 0 ; i != 3 ; i++) { 
    for (int j = 0 ; j != myLengths[i] ; j++) { 
     putchar(myArrays[i][j]); 
    } 
    putchar('\n'); 
} 

Demo on ideone.

+0

Действительно ли это работает? Ухоженная. –

+0

@PeterSchneider Абсолютно, это так! Я добавил демо. – dasblinkenlight

+3

Чтобы прояснить для тех, кто жил под скалой за последние 15 лет: это решение использует концепцию C _compound literals_, которая была введена со стандартом C99. (На самом деле их не нужно использовать, но вы можете объявить каждый массив как отдельную переменную и достичь того же результата.) – Lundin

0

Объявляем массив указателей:

char* ptrArray [] = 
{ 
    array1, 
    array2, 
    ... 
}; 

Чтобы отслеживать их индивидуальные размеры, объявляйте другой массив с тем же размером, который содержит размеры, или встроенные массивы в структурах, где размер является одним членом, а указатель на другой - другим.

+0

Это может означать, что я должен объявить каждый массив, а затем использовать их в _ptrArray_, но я хочу просто инициировать каждый массив в основном массиве. – rezCash

+0

@rezCash С какой целью? У вас есть разумная причина для того, чтобы иметь их в одном массиве, или вы просто «чувствуете» это? – Lundin

-1

Сейчас на C++ вы можете сделать вектор векторов. Что-то вроде следующего.

std::vector< std::vector<char> > myArrays; 
myArrays.resize(3); 
myArrays[0].resize(3); 
myArrays[1].resize(1); 
myArrays[2].resize(2); 

Но это C++, а не C. Кроме того, std :: vector использует кучу памяти за кулисами.

Но это самое близкое к тому, о чем вы просили, о чем я могу думать.

+0

Вопрос о C, поэтому ваш ответ не соответствует теме и не имеет значения. Также OP специально запросил решение, которое не использует память кучи. – Lundin

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