0

我正在尝试使用两个结构在 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;
}

通过搜索,我找到了关于如何通过使用 malloc 来初始化结构中的结构数组来初始化空间的答案,但是我很困惑我的代码将如何排列,因为我有定义循环缓冲区的开始结束的指针在 struct2 中,以及作为 struct1 一部分的下一个指针。

此外,我选择定义 ***newBuf* 而不是 **newBuf*,因为我认为它以某种方式指向指针(考虑单链表)。不过,如果我错了,请纠正我。

我已经在 J​​ava 中完成了动态分配的循环缓冲区,但不是 C 或 C++,所以我很难弄清楚如何初始化所有内容的差异。我基本上被困在这个烂摊子上,不知道下一步该去哪里。

任何可以提供的帮助将不胜感激!

4

1 回答 1

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;
}
于 2013-04-07T23:30:42.990 回答