开发者

Why can't I access this struct through its pointer?

开发者 https://www.devze.com 2022-12-19 11:12 出处:网络
#include <stdio.h> #include <stdlib.h> typedef int element; struct cell { element e; struct cell *p;
#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;
}

I'm just getting started with malloc and I just made a pointer to a newly created CELL, which is a struc开发者_如何学运维t. Now I'm trying to fill it with some values, but I'm greeted by an unfriendly "request for member e" in something not a structure or union". I did make a pointer to a struct that contains a member called e, or at least that's what I think I did. Why does this fail?


I think this nicely illustrates a rule of good C style - do not create typedefs that hide the fact that something is a pointer.


Change

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

*p.e = 8;

to

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

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


Since the typedef is a pointer type I think you want to cast it as a CELL not a CELL*.


Just to complete the other fine answers by being explicit:

in your code, you define the CELL type to be "a pointer to a struct cell". Then you create yo local variable p to be a CELL *, i.e. "a pointer to a value of type CELL". In other words, a pointer to a pointer. That's one level too much. The "->" operator only follows one level of indirection, not two.


I settled for this:

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

Thanks everyone.

0

精彩评论

暂无评论...
验证码 换一张
取 消