Массив структур - PullRequest
       21

Массив структур

2 голосов
/ 08 февраля 2011

Как массив структур создается в C, не зная конечного количества структур, которые будут храниться в массиве?

Я хотел бы зациклить цикл for, создать набор переменных tempStruct, добавить его в массив, а затем повторить цикл, создав новый tempStruct и добавив его в массив.

У меня возникли некоторые проблемы, связанные с тем, как это делается в C, и я пытаюсь отразить цель C.

Ответы [ 5 ]

5 голосов
/ 08 февраля 2011

Динамически распределяемые массивы (используя malloc) могут быть перераспределены (используя realloc).

Поэтому решение будет выглядеть примерно так:

  1. malloc исходный массив (произвольный размер)
  2. пока в массиве еще место, добавьте структуры
  3. когда массив заполнен, realloc к большему размеру
  4. Перейти к 2
1 голос
/ 08 февраля 2011

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

struct list{
 list* next;
 list* prev;
 special_data* data;
}

легко сделать и гибкий

0 голосов
/ 08 февраля 2011
struct foo {int bar;};

size_t i = 0, n = 8;
struct foo *arr = malloc(n * sizeof *arr);

int bar;

while ((bar = get_next_bar()) != -1) {
    if (++i == n) { // no room for new element; expand array
        arr = realloc(arr, n *= 2);
        if (arr == NULL) abort; // see note below.
    }
    arr[i] = (struct foo){bar};
}

Количество назначенных элементов в массиве равно i+1.Не забудьте free() массив, когда вы закончите с ним.

Примечание: В реальных программах вы, как правило, не делаете p = realloc(p, s) напрямую.Вместо этого вы присваиваете результат realloc() новому указателю, затем выполняете обнаружение и обработку ошибок до того, как заглушит ваш исходный указатель.

0 голосов
/ 08 февраля 2011

Вы не можете создать массив в C, не зная числа его членов заранее.Возможны следующие варианты добавления:

  • (Быстрее) Создать новый массив с +1 элементом, скопировать весь массив и добавить новый элемент в конец
  • (Лучше) Создать собственную реализациюсвязанный список ( связанный список ), который будет динамически выделять память для каждого нового члена.
0 голосов
/ 08 февраля 2011

Вы можете использовать malloc для создания своей структуры.

Редактировать: ниже показан один из способов сделать то, что вы просите, создав связанный список:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int data;
  void* next;
} tempStruct;

#define NUM_STRUCTS 4

int main(void) {
  tempStruct* cur_ptr;
  tempStruct* root_ptr;
  int i;

  root_ptr = malloc(sizeof(tempStruct));
  root_ptr -> data = 0;
  root_ptr -> next = NULL;
  cur_ptr = root_ptr;
  for (i = 1; i < NUM_STRUCTS; i ++ ) {
    tempStruct* new_ptr = malloc(sizeof(tempStruct));
    new_ptr -> data = i;
    new_ptr -> next = NULL;
    cur_ptr -> next = new_ptr;
    cur_ptr = cur_ptr -> next;
  }

  cur_ptr = root_ptr;
  while (cur_ptr != NULL) {
    printf("cur_ptr -> data = %d\n", cur_ptr -> data);
    cur_ptr = cur_ptr -> next;
  }
  return 0;
}

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

the_data = malloc(NUM_STRUCTS * sizeof(tempStruct);

Тогда вам придетсяполучить доступ к данным с помощью оператора точки (т. е. '.' (в вашем коде нет кавычек).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...