我合理地确定我对C中的指针有一个可怕的理解(至少在语法上)。
我正在尝试使用一个包含大量数据的链表的结构。后来,我尝试添加一个新结构作为该链表的头部,指向旧头部,其中有一个先前的"链接到新头。
array
我收到了这些错误:
typedef struct{
int sequence_number;
int file_descriptor;
FILE *requested_file;
int bytes_remaining;
int quantum;
struct RCB *next;
struct RCB *prior;
} RCB;
RCB *RRhead;
...
function blah(){
RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
RRhead->prior = &new_rcb;
RRhead = &new_rcb;
sequence_counter++;
}
答案 0 :(得分:3)
RCB
和struct RCB
是两种完全不同的,不相关的类型。 struct RCB
永远不会在您的代码中定义,因此不完整。
要使它们相同,写一下
typedef struct RCB {
....
} RCB;
答案 1 :(得分:1)
这是问题的一部分。
在初始化*RRhead
时不要使用new_rcb
。你只想要RRhead
。
结构有一个指针,即struct RCB *prior
所以你必须使用指针RRhead
。
答案 2 :(得分:1)
首先,RRhead只是一个指针,所以当你进入RRhead->之前,你会得到一个运行时错误,因为RRhead并没有指向任何东西(RRhead-> previous表示" get RRhead指向的RCB结构的'先前属性
其次,当你传递* RRhead作为new_rcb的最后一个初始化器时:previous是一个RCB指针,而RRhead是一个RCB指针。它们是相同的类型,因此不需要进行任何引用或解除引用,只需通过RRhead。这将使new_rcb的先前属性指向当时RRhead指向的任何内容(当时没有任何内容,因为RRhead没有被初始化为任何值)
第三,RRhead-> prior = new_rcb;是错的,因为先前的'是一个RCB指针,而new_rcb不是一个指针,它是一个RCB。传递new_rcb的地址,去RRhead-> previous =& new_rcb;
最后,您不太可能希望将new_rcb静态分配。
答案 3 :(得分:1)
这里有很多问题。我不清楚你的真实代码是什么,因为你不断改变它,但我有一个裂缝:
首先,在C中,struct标签位于一个单独的"命名空间中。输入typedef名称。 struct RCB
和RCB
之间没有关系。特别是,在这段代码中:
typedef struct {
struct RCB *next;
struct RCB *prior;
} RCB;
next
不指向RCB
。它指向struct RCB
,它与RCB
完全不同。这就是您收到错误error: dereferencing pointer to incomplete type
的原因。您从未定义struct RCB
是什么。
如果你想要一个包含自身指针的结构,你必须使用struct标签,因为typedef名称在typedef完成之前不存在。例如:
struct RCB
{
// ...
struct RCB *next, *prior;
};
typedef struct RCB RCB;
当然,typedef是可选的;并且可以与结构定义相结合,但我认为将两者分开是更清楚的。
下一个问题是:
new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
在C中不允许这样做,赋值运算符的右侧必须是表达式。括号括起的列表不是表达式。避免此问题的最简单方法是使用初始化:
RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
最新编辑中暗示了另一个运行时问题:
function blah(){
RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
RRhead->prior = &new_rcb;
RRhead = &new_rcb;
sequence_counter++;
}
显然这是某种伪代码。但new_rcb
是blah
函数的局部变量。 new_rcb
返回时blah
停止存在。这意味着RRhead
指向的列表将包含一个悬空指针。
使用指针时,您需要有一个非常清晰的心理图像,指出指针指向的位置以及指向的对象的生命周期。
要解决此问题,您可以使用动态分配(malloc
)或某种内存池。