我正在尝试使用两个结构在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 ++,所以我很难弄清楚如何初始化所有内容的差异。我基本上陷入了困境,不确定下一步该去哪里。
非常感谢任何可以给予的帮助!
答案 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;
}