Вопрос по c, c++ – Разыменование пустого указателя в C ++

1

Я пытаюсь реализовать общий связанный список. Структура для узла выглядит следующим образом -

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

Теперь, когда я пытаюсь присвоить адрес данным, предположим, например, для int, например:

int n1=6;
node *temp;
temp = (node*)malloc(sizeof(node));
temp->data=&n1;

Как я могу получить значение n1 из узла? Если я говорю -

cout<<(*(temp->data));

Я получил -

`void*' is not a pointer-to-object type 

Не получает ли указатель void тип-тип с указателем типа int, когда я присваиваю ему адрес типа int?

@PaulRL ОП упоминает C в качестве языка реализации в заголовке своего вопроса. dirkgently
если это не упражнение, прекратите изобретать велосипед и используйте, например, связанный список предоставлен вglib Bort
Можем ли мы сохранить вопрос cout / printf здесь? Это просто разыменование пустого указателя и да, это упражнение. theharshest
@dirkgentlycout не C. David Heffernan
Почему вы используете malloc и указатели в стиле C в программе на C ++? Paul R

Ваш Ответ

4   ответа
7

Вы должны сначала ввестиvoid* к действительному действительному типу указателя (например,int*) сообщить компилятору, сколько памяти вы ожидаете для разыменования.

Error: User Rate Limit Exceededstd::list
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded theharshest
0

Введите временные данные & gt; в int и затем напечатайте.

cout<<*((int *)temp->data);
4

Указатель void не может быть разыменован. Вам нужно привести его к подходящему не пустому типу указателя. В этом случае,int*

cout << *static_cast<int*>(temp->data);

Поскольку это C ++, вы должны использовать приведения C ++, а не C-стили. И вы не должны использоватьmalloc в C ++ и т. д. и т. д.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
2

Указатель void не может быть разыменован. Вам нужно привести его к подходящему не пустому типу указателя. Вопрос касается C ++, поэтому я предлагаю рассмотреть возможность использования шаблонов для достижения вашей цели:

template <typename T> struct node
{
   T *data;
   node<T> *next;      
};

затем:

int n1=6;
node<int> *temp = new node<int>();
temp->data=&n1;

И наконец:

cout << (*(temp->data));

Типизация возможна, но это будет небезопасное решение в стиле C, а не C ++.

Error: User Rate Limit ExceededtypedefError: User Rate Limit ExceededT*Error: User Rate Limit ExceededTError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededT*Error: User Rate Limit Exceededvoid*Error: User Rate Limit ExceededTError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы