C - 在结构中动态分配结构的循环缓冲区

时间:2013-04-07 23:21:23

标签: c struct dynamic-allocation circular-buffer

我正在尝试使用两个结构在C中开发动态分配的循环缓冲区。一个包含详细信息,另一个主要用作从main到循环缓冲区结构的指针(因为在运行时将分配多个数组)。

由于它是一个循环缓冲区,我有一个指向“next”的指针指向数组中的下一个项目(所以最后一个数组索引指向第一个,等等)

这是我拥有的两个结构对象:

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

从搜索中我发现this answer on how to initialize an array of structs within a struct通过使用malloc初始分配空间,但我很困惑我的代码如何排列,因为我有指向定义 start end < / em>在struct2中定义的循环缓冲区,以及 next 指针作为struct1的一部分。

此外,我选择定义*** newBuf *而不是** newBuf *,因为我正在考虑将其作为指针的指针(考虑单链表)。但是,如果我错了,请纠正我。

我已经在Java中动态分配循环缓冲区,但不是C和C ++,所以我很难弄清楚如何初始化所有内容的差异。我基本上陷入了困境,不确定下一步该去哪里。

非常感谢任何可以给予的帮助!

1 个答案:

答案 0 :(得分:1)

您遇到麻烦的原因是因为您正在尝试使用指针指针,而不仅仅是使用普通指针。您想要访问第一个指针指向的地址中包含的指针。您可以尝试访问原始指针地址(仅与地址一样大)的内存空间之外的成员。然后你就会遇到麻烦,因为你没有初始化你的阵列&#39; curr&#39;无论是。我做的另一件事并不重要,但是帮助你理解指针使你的数组​​成为一个指针 - 这就是数组在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;
}