错误:取消引用指向不完整类型的指针

时间:2013-03-11 18:10:04

标签: c

查看了与此相关的许多其他SO帖子,但没有人能够帮助我。所以,我定义了以下结构:

 typedef struct
    {
    int created;
    double data;
    int timeLeft;
    int destination;
}dataPacket;

typedef struct
{
    dataPacket *array;
    int currIndex;
    int firstIndex;
    int nextTick;
    int maxLength;
    int length;
    int stime;
    int total;


}packetBuffer;

typedef struct{
    int mac;
    struct wire *lconnection;
    struct wire *rconnection;
    int numRecieved;
    struct packetBuffer *buffer;
    int i;
    int backoff;
}node;

typedef struct{
    float length;
    float speed;
    int busy;
    struct dataPacket *currPacket;
    struct node *lnode;
    struct node *rnode;
}wire;

然后我尝试使用以下功能:

    int sendPacket(node *n, int tick)
{
    if(n->buffer->length > 0)
    {
        if(n->backoff <= 0)
        {
            if (n->lconnection->busy != 0 || n->lconnection->busy != 0)
            {
                n->i++;
                n->backoff = (512/W * genrand()*(pow(2,n->i)-1))/TICK_LENGTH;
            }
            else
            {
                n->lconnection->busy = 1;
                n->rconnection->busy = 1;
                n->lconnection->currPacket = n->buffer[n->buffer->currIndex];
                n->rconnection->currPacket = n->buffer[n->buffer->currIndex];
            }
        }
        else
        {
            n->backoff--;
        }
    }
}

每当我尝试访问缓冲区,lconnection或rconnection的成员时,我都会收到标题中描述的错误。

2 个答案:

答案 0 :(得分:5)

struct packetBuffer *buffer;

您已经定义了类型packetBuffer(其他匿名结构的typedef)。

您尚未定义struct packetBuffer

如果没有现有类型struct packetBuffer,编译器会将其视为不完整类型,假设您稍后将完成它。声明

struct packetBuffer *buffer;

完全合法,但除非buffer类型可见,否则您无法取消引用struct packetBuffer

只需删除struct关键字。

(我个人倾向于放弃typedef并始终将结构类型称为struct whatever,但这是风格和品味的问题。)

答案 1 :(得分:1)

以下内容:

typedef struct { int x; char *y; ... } my_struct;

为匿名结构创建标识符。顺序,对于一个引用自身实例的结构,它不能是“匿名的”:

typedef struct my_struct {
    int x;
    char *y;
    struct my_struct *link
    ....
} my_struct_t;

这意味着my_struct_t现在是struct my_struct类型,而不仅仅是一个匿名结构。另请注意,struct my_struct可以在其自己的结构定义中使用。匿名结构是不可能的。

作为最终的并发症,my_struct中的struct my_struct位于与my_struct_t不同的“命名空间”中。这有时用于简化(或混淆)代码中的内容:

typedef struct my_struct {
    int x;
    char *y;
    struct my_struct *link
    ....
} my_struct;

现在,我可以在代码中的任何位置使用my_struct,而不是struct my_struct

最后,您可以将typedef与结构定义分开以实现相同的效果:

struct my_struct {
    int x;
    char *y;
    struct my_struct *link;
    ....
};
typedef struct my_struct my_struct;

如David R.Hanson的 C接口和实现中所述,“此定义是合法的,因为结构,联合和枚举标记占用的名称空间与变量,函数的空间分开,并输入名称。“