我相当肯定我对C语言中的指针有着糟糕的理解(至少在语法上)。
我正在尝试一个结构,它是一个带有一堆数据的linkedlist。稍后,我尝试添加一个新结构作为linkedlist的头,指向旧的头,它有一个指向新头的“previor”链接。
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++;
}
我得到了这些错误:
sws.c: In function ‘admit_to_scheduler_RR’:
sws.c:317:3: warning: initialization from incompatible pointer type [enabled by default]
RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL};
sws.c:317:3: warning: (near initialization for ‘new_rcb.next’) [enabled by default]
sws.c:318:17: warning: assignment from incompatible pointer type [enabled by default]
RRhead->prior = &new_rcb;
最佳答案
这里有很多问题。不清楚你真正的代码是什么,因为你一直在修改它,但我有一个裂缝:
首先,在C语言中,struct标记位于typedef名称的单独“命名空间”中。struct RCB
与RCB
之间没有关系。特别是在本规范中:
typedef struct {
struct RCB *next;
struct RCB *prior;
} RCB;
next
不指向aRCB
。它指向一个struct RCB
,这是一个与RCB
完全不同的类型。这就是为什么会出现错误error: dereferencing pointer to incomplete type
。你从未定义过什么是struct RCB
。如果希望包含指向自身的指针的结构,则必须使用Stutt标记,因为TyPulf名称在TyPulf完成之前不存在。例如:
struct RCB
{
// ...
struct RCB *next, *prior;
};
typedef struct RCB RCB;
当然,typedef是可选的;可以与struct定义结合使用,但我认为将两者分开更清楚。
下一个问题是:
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
)或某种内存池。