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;
}