Se ho un puntatore nullo, come faccio a mettere un int in esso?
-
19-09-2019 - |
Domanda
Ho una matrice di valori arbitrari, così ho definito come un array di puntatori nulli, così posso puntare a qualsiasi tipo di informazione (come int
, array di caratteri, ecc). Tuttavia, come faccio in realtà un assegno int
ad esso?
Prendiamo ad esempio queste inizializzazioni:
void* data[10];
int x = 100;
La mia intuizione potrebbe pensare questo, ma questo dà un errore di compilazione:
data[0] = malloc(sizeof(int));
*(data[0]) = x;
Anche io pensato di usare &x
, ma vorrei prendere l'indirizzo di una variabile locale, che (la mia comprensione) verrebbe cancellato dopo l'uscita dalla procedura. Quindi, se ho un x
variabile locale, come potrei farlo in un vuoto tipo di puntatore di variabili correttamente?
Soluzione
*((int*)data[0])=x;
lo farà.
Si potrebbe voler considerare l'utilizzo di un sindacato. Qualcosa di simile a questo:
union myvalues
{
int i;
double d;
long l;
};
Si potrebbe quindi avere
union myvalues *foo[10];
foo[0] = malloc(sizeof(union myvalues));
foo[0]->i = x;
È anche possibile typedef
l'unione. sizeof(union myvalues)
sarà il massimo sizeof
membri. Quindi, se avete int i;
e char c[40]
nel sindacato, sizeof(union myvalues)
sarà 40. La scrittura a i
poi sovrascrivere i primi 4 caratteri a c
(supponendo che l'interi sono 4 byte).
Altri suggerimenti
*((int *)data[0]) = x;
Una copia di x sarà effettuato, quindi il fatto che è una variabile locale non è importante.
per aliasing ragiona il suo gran lunga migliore di fare
mempcy( data[0], &x, sizeof( int ) );
come avviene il compilatore ottimizzerà la chiamata memcpy come sizeof (int) è un valore costante, ma non si romperà varie regole di aliasing.
Sebbene sia possibile utilizzare un cast per fare l'assegnazione, è probabilmente molto più pulito di scrivere il codice come:
void *data[ 10 ]; int x = 100; int *p; p = malloc( sizeof *p ); data[ 0 ] = p; *p = x;
provare questo:
data[0] = malloc(sizeof(int));
*((int*)data[0]) = x;
o
(int) (*(data[0])) = x;
non dimenticare di
free (data[0]);
in seguito.