2016-01-12 3 views
-1

Я хочу создать программу, которая создает список ссылок, содержащий массивы. Однако я хочу, чтобы каждая ссылка имела меньший массив, чем предыдущий. в данный момент программа работает, но я хочу знать, действительно ли программа фактически создает меньшие массивы, поэтому свободное пространство не напрасно.Каждый список ссылок имеет меньший массив, имеет ли смысл в C?

int main() 

{ 
    int c=3; 
    int d=0; 

    typedef struct mylist { 
     struct mylist *link; 
     int info[c-d]; 
    }Node; 

    Node *a = (Node*) malloc (sizeof (Node)); 
    a -> link = NULL; 
    Node *b = a; 
    int i=0,j=0; 

    while (i!=4){ 
     while ((j)<=(2-d)){ 
      printf("link%d array%d ",i,j); 
      scanf("%d",&a->info[j]); 
      j++; 
     } 
     j=0; 
     if (i !=3){ 
      a -> link = (Node*) malloc (sizeof (Node)); 
      a = a -> link; 
     } 
     d++; 
     i++; 
    } 
    d=0; 
    a = b; 
    while (a != NULL){ 
     while ((j)<=(2-d)){ 
      printf("%d ->", a->info[j]); 
      j++; 
     } 
     j=0; 
     d++; 
     a = a -> link; 
    } 
    a=b; 

    printf(" the end"); 

    return 0; 
} 
+3

Это странная конструкция .. –

+0

Отметьте свой код, пожалуйста. – LPs

+1

Пожалуйста, сначала прочитайте об углублении. Этот код не читается. – Olaf

ответ

0

Прежде всего, вы не free() ИНГ памяти, которые вы выделили, убедитесь, что вы заботитесь об этом.

Теперь вы спрашиваете, не используете ли вы какую-либо дополнительную память - чтение кода для нас довольно сложно, как вы можете видеть в комментариях. Всегда полезно попробовать это самостоятельно - узнать размер памяти, занятой во время инициализации структуры, либо с помощью оператора sizeof(), либо с проверкой ваших значений.

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

Если вы хотите использовать динамическое распределение памяти, вам необходимо использовать функцию malloc(). При создании нового узла вам также придется выделять память для массива (и рассчитать, какой размер вы хотите дать). Это также решит вашу проблему: не зная размер массива или не уверен в этом очень хорошо, так как вы явно объявляете, сколько памяти вы выделяете для массива.

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

+0

Я новичок в списке ссылок и выделяю память в программировании :(В этот момент я знаю, что вы можете создать список ссылок, который содержит постоянный размер, такой как 6 -> 7 -> 8 или [4,5,6 ] -> [6,4,3] -> [5,6,7]. Я хочу знать, можно ли создать список ссылок, который может содержать не постоянный размер, например [4,3,2 ] -> [2,3] -> [6], это то, что я пытаюсь сделать в этой программе, но я думаю, что мой ссылочный список работает так же в данный момент [4,3,5] -> [4,2, null] -> [5, null, null] – MeHow

+0

Возможно, вы пытаетесь использовать функцию 'malloc()'. 'Malloc()' возвращает указатель к блоку памяти с размером, который вы просили. Итак, что вы хотите сделать, сначала выделите память для связанного узла списка, а затем выделите память для массива внутри него. (int info [] должно стать int * info, после чего вы сделаете a-> info = malloc (sizeof (int) * size), где размер будет количество целых чисел, которые вы хотите, чтобы массив мог хранить. Для получения дополнительной информации об использовании malloc, Google поможет вам найти много учебников. – prkist

+1

В частности, «элемент гибкого массива» может быть добавлен в конец 'struct', определяя член' info' как 'int info [];'. Это работает для C99 и далее. Некоторые пре-C99-стандартные компиляторы также поддерживали его, хотя в некоторых из них вы должны были определить его как массив нулевой длины ('int info [0];'). Для тех компиляторов, которые не поддерживают гибкий элемент массива или элемент массива нулевой длины, вы можете установить длину на '1'. Чтобы определить размер структуры с номером для N элементов, вы можете использовать макрос 'offsetof', например. 'Node * a = malloc (offsetof (Node, info [c-d]));'. –

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

  • Нет связанных вопросов^_^