Hello I am trying to use void * as a generic data type in C. What I want is a mechanism using which I can store anything and get anything. I wrote some code, but it is failing in the last case. Can anybody please take a look at the code, If you have any other idea please let me know.
I know what I am trying to store, so at that point I know the data type, but during retrial I only know the starting address and size .
Here is the code :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
static void store( void *destination, void *source, size_t size ) {
memcpy ( (char*)destination, source, size);
}
static void retrieve ( void *destination, void *source, size_t size) {
memcpy ( destination, (char*)source, size);
}
void *storage_char_ptr = (void*) malloc ( sizeof( char* ));
void *storage_int_ptr = (void*) malloc ( sizeof(int*));
void *storage_int = (void*) malloc ( sizeof( int));
int main() {
int int_in = 65;
void *int_out_ptr;
int *ptr = ( int*) malloc ( sizeof(int));
memcpy ( ptr, &int_in, sizeof(int));
store ( storage_int_ptr, &ptr, sizeof(int*));
retrieve ( &int_out_ptr, storage_int_ptr, sizeof(int*));
assert ( int_in == *(int*)int_out_ptr);
char *char_in = "HelloWorld!!";
void *char_out;
store ( storage_char_ptr, &char_in, sizeof(char*));
retrieve ( &char_out, storage_char_ptr, sizeof(char*));
assert ( strcmp ( char_in, (char*)char_out ) == 0 );
char_in = _strdup("HelloWorld!!");
store ( storage_char_ptr, &char_in, sizeof(char*));
retrieve ( &char_out, storage_char_ptr, sizeof(char*));
assert ( strcmp ( char_in, (char*)char_out ) == 0 );
/* This is where it is failing */
int_in = 55;
void* int_out;
store ( storage_int, &int_in, sizeof(int));
retrieve ( &int_out, storage_int, sizeof(int));
assert ( 55 == *(int*)int_out);
}