Estoy haciendo una clase en c ++ que admite cualquier tipo de variable para ayudarme en un proyecto futuro. El problema es que cuando bash asignar un valor a una variable void*
aparece el error: void*
no es un tipo de puntero a objeto. Aquí está el código:
int main (void) { void* a; int x; a = malloc(sizeof(int)); x = 120; ((int)(*a)) = x; printf("%d",((int)*a)); free(a); system("pause"); return 0; }
Lo veo como si estuviera tratando de asignar el valor de x en el bloque de memoria reservado para a. Quiero que el valor almacenado en x se almacene en el bloque de memoria de a. ¿Puede alguien ayudarme?
Probablemente quieras hacer:
void* a; int x; a = malloc(sizeof(int)); x = 120; *(int*)a = x; printf("%d", * (int*)a); free(a);
Lo estás haciendo demasiado complicado. Simplemente emita a
para ser un int *
, o mejor aún, declare a
como int * para empezar.
int x = 120; int * a ; // now just cast the result from malloc as int* if((a = (int *)malloc(sizeof(int))) == NULL){ //ALWAYS check exit(-1); } *a = x;
Hay formas más astutas de hacer cosas similares en C ++, pero parece que te encuentras principalmente atrapado en la syntax del puntero.
Necesita la conversión como *(int*)(a) = x;
.
En primer lugar, debe convertir a
tipo de puntero al tipo apropiado y, a continuación, anular la referencia. En segundo lugar, usa una plantilla, para eso están. En tercer lugar, malloc y free es baaaad, ok? No lo hagas Si crees que este es un buen código, necesitas un remedio C ++ serio. En cuarto lugar, esto ya está hecho, boost::any
sirve para este propósito.
Hay otras formas elegantes de asignar una variable de diferentes tipos. Para su pregunta actual puede seguir el camino estándar como,
int* const a = new int; //... *a = 120; //... delete a;
O simplemente para este problema específicamente,
int a = 120; // simple
[Nota: en su solución actual si lo hace,
*((int*)(a)) = x;
podría estar rompiendo la regla estricta de aliasing.]