C - 重新分配指针,它是struct的属性:取消引用指向不完整类型的指针

时间:2016-06-13 04:42:26

标签: c pointers struct doubly-linked-list

我合理地确定我对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++;
}

4 个答案:

答案 0 :(得分:3)

RCBstruct 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 RCBRCB之间没有关系。特别是,在这段代码中:

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_rcbblah函数的局部变量。 new_rcb返回时blah停止存在。这意味着RRhead指向的列表将包含一个悬空指针。

使用指针时,您需要有一个非常清晰的心理图像,指出指针指向的位置以及指向的对象的生命周期。

要解决此问题,您可以使用动态分配(malloc)或某种内存池。