Ok, muddling though Stack on the particulars about void*
, books like The C Programming Language (K&R)
and The C++ Programming Language (Stroustrup)
. What have I learned? That void*
is a generic pointer with no type inferred. It requires a cast to any defined type and printing void*
just yields the address.
What else do I know? void*
can't be dereferenced and thus far remains the one item in C/C++
from which I have discovered much written about but little understanding imparted.
I understand that it must be cast such as *(char*)void*
but what makes no sense to me for a generic
pointer is that I must somehow already know what type I need in order to grab a value. I'm a Java programmer; I understand generic types but this is something I struggle with.
So I wrote some code
typedef struct node
{
void* data;
node* link;
}Node;
typedef struct list
{
Node* head;
}List;
Node* add_new(void* data, Node* link);
void show(Node* head);
Node* add_new(void* data, Node* link)
{
Node* newNode = new Node();
newNode->data = data;
newNode->link = link;
return newNode;
}
void show(Node* head)
{
while (head != nullptr)
{
std::cout << head->data;
head = head->link;
}
}
int main()
{
List list;
list.head = nullptr;
list.head = add_new("My Name", list.head);
list.head = add_new("Your Name", list.head);
list.head = add_new("Our Name", list.head);
show(list.head);
fgetc(stdin);
return 0;
}
I'll handle the memory deallocation later. Assuming I have no understanding of the type stored in void*
, how do I get the value out? This implies I already need to know the type, and this reveals nothing about the generic nature of void*
while I follow what is here although still no understanding.
Why am I expecting void*
to cooperate and the compiler to automatically cast out the type that is hidden internally in some register on the heap or stack?
Aucun commentaire:
Enregistrer un commentaire