Si j’ai un pointeur vide, comment puis-je y mettre un int?

J’ai un tableau de valeurs arbitraires, je l’ai donc défini comme un tableau de pointeurs vides, de sorte que je peux pointer sur tout type d’information (comme int , tableaux de caractères, etc.). Cependant, comment puis-je lui atsortingbuer un int ?

Prenons par exemple ces initialisations:

 void* data[10]; int x = 100; 

Mon intuition penserait cela, mais cela donne une erreur de compilation:

 data[0] = malloc(sizeof(int)); *(data[0]) = x; 

Aussi, j’ai pensé à utiliser &x , mais je prendrais l’adresse d’une variable locale, qui (à ma connaissance) serait effacée après avoir quitté la procédure. Donc, si j’ai une variable locale x , comment pourrais-je l’intégrer correctement dans un type de pointeur vide?

 *((int*)data[0])=x; 

le fera.

Vous voudrez peut-être envisager d’utiliser un syndicat. Quelque chose comme ça:

 union myvalues { int i; double d; long l; }; 

Vous pourriez alors avoir

 union myvalues *foo[10]; foo[0] = malloc(sizeof(union myvalues)); foo[0]->i = x; 

Vous pouvez également typedef l’union. sizeof(union myvalues) sera le maximum de sizeof des membres. Donc, si vous avez int i; et char c[40] dans l’union, sizeof(union myvalues) sera sizeof(union myvalues) à 40. En écrivant à i , les quatre premiers caractères de c seront écrasés (en supposant que vos ints soient 4 octets).

 *((int *)data[0]) = x; 

Une copie de x sera faite, le fait qu’il s’agisse d’une variable locale n’est donc pas important.

Bien que vous puissiez utiliser un cast pour effectuer l’affectation, il est probablement beaucoup plus propre d’écrire le code tel que:

 données void * [10];
 int x = 100;
 int * p;

 p = malloc (sizeof * p);
 données [0] = p;
 * p = x;

pour des raisons de repliement son bien préférable de faire

 mempcy( data[0], &x, sizeof( int ) ); 

Il arrive que le compilateur optimise l’appel de memcpy car sizeof (int) est une valeur constante, mais cela ne casse pas les différentes règles de repliement.

essaye ça:

 data[0] = malloc(sizeof(int)); *((int*)data[0]) = x; 

ou

 (int) (*(data[0])) = x; 

n’oublie pas de

 free (data[0]); 

ensuite.