2010-02-02 4 views
1
#include <stdio.h> 
#include <stdlib.h> 

typedef int element; 

struct cell { 
    element e; 
    struct cell *p; 
}; 
typedef struct cell* CELL; 

int main() { 
    CELL* p; 
    p = (CELL*) malloc (sizeof(struct cell)); 
    p->e = 8;  /* This ain't working */ 
    *p.e = 8;  /* This doesn't help anything either */ 

    return 0; 
} 

Je viens juste de commencer avec malloc et je viens de faire un pointeur vers un nouveau CELL, qui est un struct. Maintenant j'essaye de le remplir avec quelques valeurs, mais je suis accueilli par une "demande de membre e" hostile dans quelque chose qui n'est pas une structure ou une union. "J'ai fait un pointeur vers un struct qui contient un membre appelé e, ou du moins ce que je pense que je l'ai fait. Pourquoi cela a échoué?Pourquoi ne puis-je pas accéder à cette structure via son pointeur?

Répondre

6

changement

cel* p; 
p = (CELL*) malloc (sizeof(struct cell)); 

*p.e = 8; 

à

struct cell* p; // or CELL p; 
p = (CELL) malloc (sizeof(struct cell)); 

(*p).e = 8; // . has higher precedence than * 
3

Depuis le typedef est un type de pointeur Je pense que vous voulez lancer comme une CELLULE NON CELLULAIRE *

9

Je pense que cela illustre bien une règle de style C - ne créez pas de typedefs qui cachent le fait que quelque chose est un pointeur.

0

Je me suis installé pour cela:

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

typedef int element; 

struct cell { 
    element e; 
    struct cell *p; 
}; 
typedef struct cell* CELL; 

int main() { 
    CELL p; 
    p = (CELL) malloc (sizeof(struct cell)); 
    p->e = 8; 
    (*p).e = 8; 

    return 0; 
} 

Merci à tous.

1

Juste pour compléter les autres réponses fines en étant explicite:

dans votre code, vous définissez le type CELL être « un pointeur vers un struct cell ». Ensuite, vous créez votre variable locale p pour qu'elle soit CELL *, c'est-à-dire "un pointeur vers une valeur de type CELL". En d'autres termes, un pointeur vers un pointeur. C'est trop un niveau. L'opérateur "->" suit seulement un niveau d'indirection, pas deux.

Questions connexes