2013-10-26 63 views
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(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').

+0

首先,縮進代碼。 – Kunal

+6

'H-> Cells - > [i] e'絕對不是正確的語法。 – godel9

+0

然後注意'H-> Cells - > [i] e = i;'不是C語法。 –

回答

0

H->Cells[i]->next 

應be

H->Cells[i].next 

(與e類似)

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; 
} 

+0

的指針數組,可以像下面這樣訪問next和e:H-> Cells [i] - > e ??如果不是,爲什麼不是因爲'Cells'是一個指向結構本身的指針? –

+0

不,這是不可能的。 'Cells'的類型爲'List *','Cells [i]'的類型爲List和NOT List *'。 箭頭運算符只能用於指針。 – Sohaib

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。
  • 幾壓痕水平可以通過首先做錯誤的情況下,從功能上錯誤月初返回來避免。
相關問題