【问题标题】:gcc pointer error did you mean to use ‘->’? [closed]gcc 指针错误你的意思是使用'->'吗? [关闭]
【发布时间】:2018-04-03 01:11:41
【问题描述】:

我在头文件中定义了结构

typedef struct tDLElem {                 
        int data;                 
        struct tDLElem *lptr;     
        struct tDLElem *rptr; 
} *tDLElemPtr;

typedef struct { 
    tDLElemPtr First;
    tDLElemPtr Act; 
    tDLElemPtr Last;
} tDLList;

我有这个代码

void DLInsertFirst (tDLList *L, int val) {
    tDLElemPtr *newPtr = (tDLElemPtr *) malloc(sizeof(struct tDLElem));
    if (newPtr == NULL)
        DLError();
    newPtr->lptr = NULL;
    newPtr->rptr = L->First;
    newPtr->data = val;
    if (L->First != NULL)
    {
        L->First->lptr = newPtr;
    }
    else
    {
        L->Last = newPtr;
    }
    L->First = newPtr;
}

这对我来说似乎很好,但是当我尝试构建它时,gcc 说

c206.c:在函数“DLInsertFirst”中:c206.c:104:8:错误:“*newPtr”是 一个指针;你的意思是使用'->'吗? newPtr->lptr = NULL;

c206.c:109:18:警告:来自不兼容指针类型的赋值 [-Wincompatible-pointer-types] L->First->lptr = newPtr;

你能告诉我我的代码哪里错了吗?主要是为什么当我在那里使用它时它告诉我使用'->'?谢谢

【问题讨论】:

  • 你的错误在于 pointers 使用了 typedef。 tDLElemPtr 已经是一个指针,你应该写 'tDLElemPtr newPtr. Or even better, stop adding such confusing typedef`s - 如你所见,这是一个不好的做法。
  • 我必须在那里使用 typedef,我无法更改它
  • tDLElemPtr *newPtr = (tDLElemPtr *) malloc(sizeof(struct tDLElem)); 分配了错误的空间量(您有一个指向指针的指针,但您分配了整个结构的大小)。我怀疑你想要tDLElemPtr newPtr = malloc(sizeof *newPtr);

标签: c pointers gcc struct


【解决方案1】:

如 cmets 中所述,您没有正确使用指针来构建结构。

typedef struct tDLElem {                 
        int data;                 
        struct tDLElem *lptr;     
        struct tDLElem *rptr; 
} *tDLElemPtr; // note that tDLElemPtr is a pointer!!

将此typedeftDLElemPtr 一起使用意味着您将声明的变量是struct tDLElem *指针!!!),因此tDLElemPtr *newPtr 是指向指针的指针(struct tDLElem ** ),意思是 newPtr->lptr = NULL; 实际上应该是 (*newPtr)->lptr = NULL; (我在这里添加了另一个间接访问结构本身)。

【讨论】:

    【解决方案2】:

    我怀疑你的第一个数据结构应该是这样的:

    struct tDLElem {                 
        int data;                 
        struct tDLElem* lptr;     
        struct tDLElem* rptr; 
    };
    typedef struct tDLElem* tDLElemPtr;
    

    这应该更清楚发生了什么。

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多