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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top