Почему я не могу получить доступ к этой структуре через указатель? - PullRequest
1 голос
/ 02 февраля 2010
#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» в чем-то, не являющемся структурой или объединением ». Я сделал указатель на struct, который содержит член или, по крайней мере, я так и сделал. Почему это не получается?

Ответы [ 5 ]

9 голосов
/ 02 февраля 2010

Я думаю, это хорошо иллюстрирует правило хорошего стиля C - не создавайте typedef, которые скрывают тот факт, что что-то является указателем.

6 голосов
/ 02 февраля 2010

Изменение

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 голосов
/ 02 февраля 2010

Поскольку typedef является типом указателя, я думаю, вы хотите привести его как CELL, а не CELL *.

1 голос
/ 02 февраля 2010

Просто, чтобы завершить другие прекрасные ответы, будучи явным:

в вашем коде вы определяете тип CELL как "указатель на struct cell". Затем вы создаете локальную переменную p, которая будет CELL *, то есть «указатель на значение типа CELL». Другими словами, указатель на указатель. Это один уровень слишком много. Оператор "->" следует только за одним уровнем косвенности, а не двумя.

0 голосов
/ 02 февраля 2010

Я согласился на это:

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

Спасибо всем.

...