Non riesco a capire come vengono inizializzati i seguenti elementi della struttura

3

Non riesco a capire come vengono inizializzati i seguenti elementi della struttura.

MSG m = {4, 1, 0}; .

MSG ha due elementi: uno è di tipo int e l'altro è un array di tipo short che è già stato inizializzato. A quali elementi di m sono assegnati i valori 4, 1 e 0? Ecco l'elenco del codice preso dal libro TCP IP in C 2nd Ed. (Pagina No. xi, Prefazione);

typedef struct {
    int a;
    short s[2];
} MSG;
MSG *mp, m = {4, 1, 0};
char *fp, *tp;
mp = (MSG *) malloc(sizeof(MSG));
for (fp = (char *)m.s, tp = (char *)mp->s; tp < (char *)(mp+1);)
  *tp++ = *fp++;

Anche se ho letto su C un manuale di riferimento ma non sono riuscito a trovare la soluzione. Potrei averlo trascurato ma non posso procedere finché non avrò chiarito come viene eseguita l'inizializzazione in cui un elemento di m è un array di tre elementi di tipo short int stesso.

    
posta Bishnu 23.09.2016 - 16:20
fonte

2 risposte

3

Fai così:

MSG m = {
.a = 4 
.s = {1, 0}
};

È più chiaro, funziona e non dovrai friggere le cellule cerebrali per capire cosa fa ogni volta che lo guardi.

    
risposta data 23.09.2016 - 16:38
fonte
3

Il modo corretto per inizializzare la struttura è mostrato nella risposta di Robert, ma suppongo che la domanda sia "come funziona questa inizializzazione?"

In realtà, il riferimento C descrive l'inizializzazione della struttura e consente di non utilizzare parentesi graffe extra purché il numero di elementi nell'inizializzatore sia minore o uguale al numero di elementi in aggregato. Gli snippet seguenti sono equivalenti:

MSG m = {4, 1, 0};

e

MSG m = {4, {1, 0}};

Ma questo non è corretto, poiché a element non è un aggregato:

MSG m = {{4}, {1, 0}};

Ho solo una copia russa di KR, quindi ecco una traduzione approssimativa: l'inizializzatore aggregato inizia con i ricci e tutti gli elementi all'interno di queste parentesi sono considerati parte di quell'aggregato. Se non inizia con ricci, prende tutti gli elementi che può contenere (o meno se non ci sono abbastanza elementi).

Sorprendentemente, anche i seguenti due snippet sono corretti:

MSG m = {4, 1};

e

MSG m = {4, {1}};
    
risposta data 23.09.2016 - 16:55
fonte

Leggi altre domande sui tag