C - динамическое выделение кольцевого буфера структур внутри структуры

Я пытаюсь разработать динамически распределяемый циклический буфер в C, используя две структуры. Один содержит подробную информацию, а другой по существу используется в качестве указателя от главной структуры к циклическому буферу (поскольку во время выполнения будет выделено несколько массивов).

Так как это круговой буфер, у меня есть указатель "следующий", который указывает на следующий элемент в массиве (так что последний индекс массива указывает на первый и т. Д.)

У меня есть два объекта структуры:

typedef struct {
    int a;
    int b;
    struct1 *next;   // pointer to next struct1 object in array
} struct1;

typedef struct {
    struct1 *curr;     
    struct1 *start = NULL;
    struct1 *end = NULL;
} struct2;

Затем у меня есть функция инициализации, которая вызывается из main для инициализации нового циклического буфера.

Это та часть, где я не совсем уверен, что делать.

#define minSize 10
struct2 * initialize()
{   
    struct2 **newBuf = malloc(sizeof(*newBuf));
    newBuf->malloc(sizeof(*newBuf->quotes) * newBuf->minSize);

    // set the start pointer
    newBuf.curr[0] = newBuf->start;
    newBuf.curr[0]->next = NULL;

    for (int i = 1; i < minSize; i++)
    {
        struct1 *new = NULL;     
        newBuf.curr[i] = new;    // make index i = NULL
        // have the previous index point to the "next" current
        if (i > 0)
            newBuf.curr[i-1]->next = newBuf.curr[i];
    }

    // connect last index with first
    newBuf.curr[minSize - 1]->next = newBuf.curr[0];

    // set the end pointer  
    newBuf->end = newBuf->start;

    return newBuf;
}

В результате поиска я нашел ответ о том, как инициализировать массив структур в структуре с помощью malloc для первоначального распределения пространства, но я не совсем понимаю, как будет выглядеть мой код, поскольку у меня есть указатели для определения начала и конца циклического буфера, определенного в struct2, а также следующий указатель как часть struct1.

Кроме того, я решил определить ***newBuf* вместо ** newBuf *, поскольку я рассматривал его как указатель на указатели (думая о списках с односвязными связями). Хотя, пожалуйста, поправьте меня, если я ошибаюсь.

Я сделал динамически распределяемые циклические буферы в Java, но не в C и не в C++, поэтому мне трудно разобраться в различиях в том, как все инициализировать. Я в основном застрял в этом беспорядке и не уверен, куда идти дальше.

Любая помощь, которая может быть оказана, будет высоко ценится!

1 ответ

Решение

Причина, по которой вы сталкиваетесь с проблемами, заключается в том, что вы пытаетесь получить указатель на указатель, а не просто используете обычный указатель. Вы хотите получить доступ к указателю, который содержится по адресу, указанному первым указателем. В его нынешнем виде вы пытаетесь получить доступ к члену, который находится за пределами области памяти адреса исходного указателя (который равен размеру адреса). И затем у вас возникают проблемы, потому что вы не инициализируете свой массив 'curr'. Еще одна вещь, которую я сделал, это не имеет большого значения, но помогает понять указатели, сделал ваш массив указателем - так работают массивы в C. Массив - это просто адрес первого члена массива, и когда вы индексируете в массив, он просто добавляет смещение к этому адресу = index * sizeof(yourstruct).

Что вы хотите

typedef struct {
   struct1 *curr;     
   struct1 *start = NULL;
   struct1 *end = NULL;
} struct2;

#define minSize 10
struct2* initialize()
{   
 struct2 *newBuf = (struct2 *) malloc(sizeof(struct2));
 newBuf->curr = (struct1 *) malloc(sizeof(struct1) * minSize);

// set the start pointer
 newBuf.curr[0] = newBuf->start;
 newBuf.curr[0]->next = NULL;

 for (int i = 1; i < minSize; i++)
 {
    struct1 *new = (struct1 *) malloc(sizeof(struct1));
    newBuf.curr[i] = new;
    newBuf.curr[i-1]->next = newBuf.curr[i];
 }
  // connect last index with first
  newBuf.curr[minSize - 1]->next = newBuf.curr[0];
  // set the end pointer  
  newBuf->end = newBuf->start;
  return newBuf;
}
Другие вопросы по тегам