Пустые указатели в C, используемые в стеках - PullRequest
0 голосов
/ 08 сентября 2011

Я пишу программу, которая реализует стек в c.Я хочу, чтобы каждый узел принимал данные любого типа (например, int char struct и т. Д.), Если я объявляю свою структуру узла как

    typedef struct node{
           void *data;
           struct node *next;
   }Node;

Позволяет ли это тому, что мои данные пустого указателя указывают на любой тип памяти?

Ответы [ 4 ]

3 голосов
/ 08 сентября 2011

Да, но есть некоторые предостережения, связанные с разыменованием вашего пустого указателя для доступа к данным внутри.

По сути, скажем, у вас есть узел:

Node *node;

И у вас есть некоторая структура Point:

typedef struct Point {
    int x;
    int y;
} Point;

И вы помещаете точку в узел:

Point *p = malloc(sizeof(Point));
p->x = 0;
p->y = 3;
node->data = p;

Чтобы получить доступ к членам этой точки, вы должны использовать тип:

printf("%d\n", ((Point *)node->data)->x);

Или вы можете назначить указатель правильного типа и скопировать указатель void:

Point *p = node->data;
printf("%d\n", p->x);

Потому что это не сработает:

printf("%d\n", node->data->x);

Это потому, что указатель voidне содержит информации о типах для компилятора, чтобы понять, на что указывает указатель void.

И это почти все, что вам нужно знать о том, как использовать указатели void.

1 голос
/ 08 сентября 2011

Да, возможно, чего вы хотите достичь, но вам нужно позаботиться о разыменовании указателя void. Я имею в виду, что при разыменовании вы должны набирать caste void указатель на соответствующий тип.

1 голос
/ 08 сентября 2011

Кратко, да.Это означает, что вы будете хранить указатель на int и т. Д., Чтобы он занимал место.Вам также необходимо убедиться, что вы знаете, как обрабатывать разные типы, если у вас нет однородных типов в списке.

1 голос
/ 08 сентября 2011

Позволяет ли это, чтобы данные моего указателя пустоты указывали на любой тип памяти?

Да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...