错误:' - >'的无效类型参数(有'struct node')

时间:2013-10-26 14:11:51

标签: c pointers multidimensional-array structure

为什么我无法像数组一样访问指针“Cells”?我已经分配了适当的内存,为什么它不像这里的数组?它就像一个基本数据类型指针的数组。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 10
struct node
{
    int e;
    struct node *next;
};  

typedef struct node *List;
typedef struct node *Position;

struct Hashtable
{
    int Tablesize;
    List Cells;
};

typedef struct Hashtable *HashT;

HashT Initialize(int SIZE,HashT H)
{   
    int i;
    H=(HashT)malloc(sizeof(struct Hashtable));
    if(H!=NULL)
    {
        H->Tablesize=SIZE;
        printf("\n\t%d",H->Tablesize);
        H->Cells=(List)malloc(sizeof(struct node)* H->Tablesize);

它不应该像这里的数组一样吗?

        if(H->Cells!=NULL)
        {
            for(i=0;i<H->Tablesize;i++)

以下行是引发错误的行

            { H->Cells[i]->next=NULL;
              H->Cells[i]->e=i;
                printf("\n %d",H->Cells[i]->e);
            }
         }
     }
     else printf("\nError!Out of Space");
}

int main()
{  
    HashT H;
    H=Initialize(10,H);
    return 0;
}

我得到的错误与标题错误:invalid type argument of '->' (have 'struct node').

相同

3 个答案:

答案 0 :(得分:1)

下面给出了正确版本的代码。建议在使用typedef时不要使用指针。

除此之外,您的代码唯一的问题是您的访问方法。 H->cells[i]->next会抛出错误。

H->cells->[i]e也是无效的语法。

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define MAX 10
struct node
{
    int e;
    struct node *next;
};  
typedef struct node List;
typedef struct node Position;
struct Hashtable
{
    int Tablesize;
    List *Cells;
};
typedef struct Hashtable HashT;

HashT Initialize(int SIZE,HashT *H)
{   
    int i;
    H=(HashT*)malloc(sizeof(struct Hashtable));
    if(H!=NULL)
    {
         H->Tablesize=SIZE;
         printf("\n\t%d",H->Tablesize);
         H->Cells=(List*)malloc(sizeof(List)*H->Tablesize);
     //should it not act like an array from here on?
         if(H->Cells!=NULL)
         {
             for(i=0;i<H->Tablesize;i++)
    //the following lines are the ones that throw the error
             { 
                 H->Cells[i].next=NULL;
                 H->Cells[i].e=i;
                 printf("\n %d",H->Cells[i].e);
             }
         }
    }
    else printf("\nError!Out of Space");
    return *H;
 }

 int main()
 {  
     HashT H;
     H=Initialize(10,&H); //return is not required as already we are passing by address
     return 0;
 }

#include<stdio.h> #include<stdlib.h> #include<ctype.h> #define MAX 10 struct node { int e; struct node *next; }; typedef struct node List; typedef struct node Position; struct Hashtable { int Tablesize; List *Cells; }; typedef struct Hashtable HashT; HashT Initialize(int SIZE,HashT *H) { int i; H=(HashT*)malloc(sizeof(struct Hashtable)); if(H!=NULL) { H->Tablesize=SIZE; printf("\n\t%d",H->Tablesize); H->Cells=(List*)malloc(sizeof(List)*H->Tablesize); //should it not act like an array from here on? if(H->Cells!=NULL) { for(i=0;i<H->Tablesize;i++) //the following lines are the ones that throw the error { H->Cells[i].next=NULL; H->Cells[i].e=i; printf("\n %d",H->Cells[i].e); } } } else printf("\nError!Out of Space"); return *H; } int main() { HashT H; H=Initialize(10,&H); //return is not required as already we are passing by address return 0; }

答案 1 :(得分:0)

H->Cells[i]->next

应该是

H->Cells[i].next

(同样适用于e。)

答案 2 :(得分:0)

这是没有typedef的程序版本。哪一个更具可读性?

#include <stdio.h>
#include <stdlib.h>

struct node {
    struct node *next;
    int e;
    };

struct Hashtable {
    unsigned Tablesize;
    struct node *Cells;
    };

struct Hashtable *Initialize(unsigned size)
{
    unsigned iii;
    struct Hashtable *hp;

    hp = malloc (sizeof *hp);
    if(!hp) {
        fprintf(stderr, "Error!Out of Space\n");
        return NULL;
        }

    hp->Cells = malloc(size * sizeof *hp->Cells );
    if(!hp->Cells) {
           hp->Tablesize = 0;
           return hp;
           }

    hp->Tablesize = size;
    fprintf(stderr, "\t%u\n", hp->Tablesize);
    for(iii=0; iii < hp->Tablesize; iii++) {
         hp->Cells[iii].next = NULL;
         hp->Cells[iii].e = iii;
         fprintf( stderr, " %u\n", hp->Cells[iii].e);
         }
    return hp;
 }

 int main()
 {
    struct Hashtable *hashtab;

     hashtab = Initialize(10);
     return 0;
 }

变化:

  • 删除了typedef;因为它们令人困惑
  • 从malloc()中删除了不需要且具有潜在危险的演员表。
  • 将尺寸更改为无符号。大小永远不会是负面的
  • 诊断输出应该转到stderr。
  • 首先执行错误案例,并在出错时从函数中提前返回,可以避免一些级别的缩进。