我相当肯定我对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 RCBRCB之间没有关系。特别是在本规范中:

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_rcbblah函数的局部变量。时停止存在。这意味着new_rcb指向的列表将包含一个悬挂指针。
当使用指针时,你需要有一个非常清晰的心理图像,来显示指针指向的位置和被指向对象的生存期。
要解决这个问题,可以使用动态分配(blah)或某种内存池。

09-20 01:51