I declared a void pointer
void *ptr;
and a typedef struct named testStructure, with a member 'unsigned int a'.
Now I will cast this pointer to a struct pointer:
ptr=(testStructure*)malloc(sizeof(testStructure));
Now I try to access the member of the struct...
ptr->a=5;
...and I get an error "expression must have a pointer-to-struct-or-union type"... Why is 'ptr' still void? It seems, a void pointer cannot be casted to any other pointer type... How I can do this properly? I just need ONE pointer, which can point to different structures, that means, I need to cast a void pointer...
What you say is all good but I'm having a similar problem casting (elegantly) a common pointer at runtime.
I have a common kernel which uses various dll's to implement a particular sub-system determined at runtime. Each sub-system requires a different data structure; the pointer to which must be stored at the kernel level to be within scope at runtime when I malloc() the required structure space.
I therefore want a generic (void*) pointer in the kernel. I do not want to use a specific typedef as this requires the sub-system data structure to be defined in an include that the kernel has access to (this is really my problem).
I am trying to make each sub-system (dll) self contained so wish to keep all the data definitions with the sub-system (i.e. not available to the kernel at build time).
So what I require is a way to declare a pointer (presumably 'void') and then assign it a structure type at runtime so I don't need to cast each access to the structure.
Doesn't seem a big ask but I can't see anyway around not using your
(struct*)ptr->a
syntax but this will be very messy for the many hundreds of references I'm making to the structure members.
Any other ideas?
But it is!
Types are purely a compile-time, source thing - they have no meaning at runtime to the actual CPU!
How about #define-ing a macro...?
You have 2 conflicting goals. The kernel accessing data, and you not wanting to have an understanding of what it is accessing because it is in a DLL. If the Kernel merely needs to pass the data (pointer) I suppose this works.
Erstwhile making a macro is likely the 'cleanest' route. IE
typedef struct insect { float value; char *name; uint32_t count; } insect; #define INSECT(VPTR) ((insect *)(VPTR)) #define INSECT_VALUE(VPTR) INSECT(VPTR)->value #define INSECT_NAME(VPTR) INSECT(VPTR)->name #define INSECT_COUNT(VPTR) INSECT(VPTR)->count
etc
"Erstwhile (sic?) making a macro is likely the 'cleanest' route."
Is that really the word you were looking for:
www.dictionary.cambridge.org/define.asp
"I therefore want a generic (void*) pointer in the kernel. ...
So what I require is a way to declare a pointer (presumably 'void') and then assign it a structure type at runtime so I don't need to cast each access to the structure."
Is there a reason that each subsystem can't simply assign the 'void*' to its own subsystem-specific structure pointer and use that? No casting required.
Note that C and C++ differs a bit for void* pointers.