2010-02-02 86 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; 
} 

我刚开始接触malloc,我刚刚作出了一个指针到新创建的CELL,这是一个struct。现在我试图用一些价值来填补它,但是我受到了一个不友好的“对成员e的请求”的欢迎,而不是一个结构或联盟。“我确实指向了一个包含e成员的struct,或者至少,这就是我想我做到了。为什么会失败?为什么我不能通过它的指针访问这个结构体?

回答

6

变化

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

由于该类型定义为指针类型,我认为要投它作为CELL不是CELL *。

9

我认为这很好地说明了一个良好的C风格的规则 - 不要创建隐藏事物是指针的事实的typedefs。

0

我解决这个:

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

谢谢大家。

1

只是为了通过被明确完成其他精细答案:

在你的代码,你定义CELL类型是“指向一个struct cell”。然后,您创建本地变量pCELL *,即“指向类型为CELL的值的指针”。换句话说,一个指向指针的指针。这太过分了。 “->”操作符只遵循一个间接级别,而不是两个。

相关问题