Say I have a void* named ptr. How exactly should I go about using ptr to store an int? Is it enough to write
ptr = (void *)5; If I want to save the number 5? Or do I have to malloc something to save it?
You're casting 5 to be a void pointer and assigning it to ptr.
Now ptr points at the memory address 0x5
If that actually is what you're trying to do .. well, yeah, that works. You ... probably don't want to do that.
When you say "store an int" I'm going to guess you mean you want to actually store the integer value 5 in the memory pointed to by the void*. As long as there was enough memory allocated ( sizeof(int) ) you could do so with casting ...
void *ptr = malloc(sizeof(int)); *((int*)ptr) = 5; printf("%d\n",*((int*)ptr)); void*, but all I need is an int.That will work on all platforms/environments where sizeof(void*) >= sizeof(int), which is probably most of them, but I think not all of them. You're not supposed to rely on it.
If you can you should use a union instead:
union { void *ptr; int i; }; Then you can be sure there's space to fit either type of data and you don't need a cast. (Just don't try to dereference the pointer while its got non-pointer data in it.)
Alternatively, if the reason you're doing this is that you were using an int to store an address, you should instead use size_tintptr_t so that that's big enough to hold any pointer value on any platform.
size_t. It isn't guaranteed to be able to hold all possible addresses of pointers. intptr_t and uintptr_t are there for that since C99. In C90 you're out of luck. I can even give you a platform where size_t is 16 bits wide and pointers are 32 bits wide: x86 in real mode using memory model HUGE, FAR and COMPACT. size_t can be seen as the type used for addressing arrays, nothing more.
castis sufficient..................