【问题标题】:C request for member ***** in something not a structure or unionC 在非结构或联合的情况下请求成员 *****
【发布时间】:2017-10-22 14:45:12
【问题描述】:

我知道有些帖子就像这个帖子一样,但是这些帖子上的所有解决方案都对我没有帮助,他们往往只是说将 l.valor 切换为 l->valor,这对我来说不起作用,我不明白为什么。

这就是我所拥有的:

typedef struct lligada {
    int valor;
    struct lligada *prox;
} *LInt;

void insertOrd (LInt *g, int x){
    if (g != NULL) g->valor = x;
}

我得到了这个:

error: request for member 'valor' in something not a structure or union if (g == NULL) g->valor = x;

我做错了什么?

PS:这是一个叫做 codeboard 的平台上的练习,是作业,我不能更改结构声明,也不能更改函数 insertOrd 的参数,我必须使用我在 insertOrd 上得到的内容并制作函数工作

【问题讨论】:

  • 1) l是指向struct lligada的指针
  • l 很容易与等宽字体中的1 混淆,并且是单字母变量最糟糕的用法。并且函数参数的名称应该帮助用户不妨碍他们。
  • 我已经更改了它以避免混淆,但它不是我设置的,我只需要完成它。
  • (*g)->valor 等。如果您需要对其应用取消引用操作,隐藏在 typedefs 中的指针会令人困惑。

标签: c list pointers singly-linked-list


【解决方案1】:

你必须写

void insertOrd (LInt *g, int x){
    if (*g != NULL) ( *g )->valor = x;
        ^^ ^^         ^^^
}

void insertOrd (LInt g, int x){
                ^^^^^^
    if (g != NULL) g->valor = x;
          ^^
}

因为呈现的函数中参数g的类型是struct lligada **

【讨论】:

  • 我认为这行得通,但是我遇到了其他问题,如何检查我作为参数收到的 LInt *g 是否为空?如果它是空的,我应该使 (*g)->valor = x,但是这样做 if((*g)==NULL) 会给我分段错误
  • @NepsName if (g != NULL && *g != NULL)
  • @NepsName 我在答案中写道,您必须检查 if ( *g != NULL ) 而不是 if ( *g == NULL )
【解决方案2】:

从结构声明中删除 *:

typedef struct lligada {
    int valor;
    struct lligada *prox;
} LInt;

顺便说一句,你的 NULL 检查是相反的。应该是if (l != NULL)

【讨论】:

  • 好吧,我应该已经说过了。这是在一个叫做 codeboard 的平台上的练习,是作业,我不能改变结构声明,也不能改变函数 insertOrd 的参数,我必须使用我在 insertOrd 上得到的东西并使函数工作跨度>
  • @NepsName 在完成作业之前,您可以随心所欲地准备作业。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多