【问题标题】:invalid type argument of ‘->’‘->’的无效类型参数
【发布时间】:2013-09-22 11:57:15
【问题描述】:

在下面两个标记的行上,我收到错误为“'->' 的无效类型参数” 请建议如何纠正它

#include<stdio.h>

struct arr{
    int distance;
    int vertex;
};

struct heap{
    struct arr * array;

     int count; //# of elements
     int capacity;// size of heap
     int heapType; // min heap or max heap
};


int main(){
    int i;
    struct heap * H=(struct heap *)malloc(sizeof(struct heap));
    H->array=(struct arr *)malloc(10*sizeof(struct arr));

    H->array[0]->distance=20;//error

    i=H->array[0]->distance;//error

    printf("%d",i);
}

【问题讨论】:

  • H-&gt;array 包含 10 个 struct arr,而不是 10 个 struct arr *。所以不需要额外的取消引用。第一行应该是H-&gt;array[0].distance = 20;
  • @Praetorian - 你为什么在评论中回答问题而不是作为实际答案?
  • @pzaenger 我最好说:不要转换 malloc 的结果。
  • @Andrew 当然是为了获得评论代表! :P 我认为简洁的评论不值得回答,也没有时间输入更详细的答案。

标签: c pointers structure


【解决方案1】:

-&gt; 的左参数必须是一个指针。 H-&gt;array[0] 是一个结构,而不是一个指向结构的指针。所以你应该使用. 操作符来访问一个成员:

H->array[0].distance = 20;
i = H->array[0].distance;

或将它们组合起来:

i = H->array[0].distance = 20;

顺便说一句,在 C 中你应该转换malloc() 的结果。 malloc() 返回void*,C 自动将其强制转换为目标类型。如果你忘记#includemalloc() 的声明,演员将压制你应该得到的警告。在 C++ 中并非如此,但在 C++ 中,您通常应该更喜欢 new 而不是 malloc()

【讨论】:

    【解决方案2】:

    下标隐式取消引用array 成员。如果array 的类型为struct arr *,那么array[0] 的类型为struct arr(记住a[i] 等价于*(a + i));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多