2015-05-14 16 views
10

In questo codice, tutti i 100 articoli di C.B verranno inizializzati a zero?{0, 0} inizializzerà l'array nella struct?

struct A { int B[100]; int D; }; 
A C = {0, 0}; 

Sembra funzionare, ma la memoria potrebbe essere stata semplicemente vuota in anticipo.

+0

Questo non è un duplicato, si può vedere la differenza tra l'inizializzazione array e struct? – exebook

+0

'A C = {0};' esegue l'inizializzazione del valore di un aggregato, quindi valore-inizializza ogni membro. Quindi in effetti l'array membro è effettivamente azzerato. – vsoftco

+0

@vsoftco, dovrebbe essere {{0}} invece? – exebook

risposta

5

La linea

A C = {0, 0}; 

Esegue value initialization del aggregateA. Secondo lo standard, i ganci possono essere omessi per l'inizializzazione aggregato:

8.5.1 Aggregati [dcl.init.aggr]/12

ganci può essere tralasciata in un inizializzatore lista come segue . Se l'elenco di inizializzazione inizia con una parentesi graffa sinistra, il successivo elenco di clausole di inizializzazione separato da virgola inizializza i membri di un sottoaggregato; è errato che ci siano più clausole di inizializzazione rispetto ai membri. Se, tuttavia, l'elenco di inizializzazione per un sotto aggregato non inizia con una parentesi graffa sinistra, solo le clausole di inizializzazione dall'elenco vengono convertite in solo membri del sottoaggregato, solo ; eventuali rimanenti clausole di inizializzazione sono sinistra per inizializzare il membro successivo dell'aggregato di cui il sottogruppo corrente è un membro.

[Esempio:

float y[4][3] = { 
    { 1, 3, 5 }, 
    { 2, 4, 6 }, 
    { 3, 5, 7 }, }; 

è un'inizializzazione completamente controventata: 1, 3, e 5 inizializzare la prima riga della matrice y [0], cioè y [0] [0], y [0] [1] e y [0] [2]. Allo stesso modo le prossime due righe inizializzano y [1] e y [2]. L'inizializzatore termina presto e quindi gli elementi di y [3] sono inizializzati come se inizializzati esplicitamente con un'espressione del formato float(), cioè inizializzati con 0.0. Nell'esempio seguente, le parentesi nella lista di inizializzazione sono eliminate; tuttavia la inizializzatore-lista ha lo stesso effetto come completamente controventata inizializzatore lista dell'esempio precedente,

float y[4][3] = { 
    1, 3, 5, 2, 4, 6, 3, 5, 7 }; 

L'inizializzatore for y inizia con una parentesi sinistra, ma quella per y [0] fa no, quindi vengono utilizzati tre elementi dall'elenco. Allo stesso modo i prossimi tre sono presi in successione per y [1] e y [2]. - Esempio end]

Successivo

8.5.1 Aggregati [dcl.init.aggr]/7

Se ci sono meno di inizializzazione-clausole della lista che ci sono membri nell'aggregato, quindi ciascun membro non inizializzato esplicitamente deve essere inizializzato dal suo inizializzatore di parentesi o di uguale o, se non è un inizializzatore di controvento o equalizzatore, da un elenco di inizializzazione vuoto.

Nel vostro caso, questo significa che il primo 0 viene assegnato B[0] e il secondo 0 viene assegnato B[1]. Quindi, a 8.5.1/7, il resto degli elementi viene inizializzato in base al valore.

Tuttavia, per chiarezza, in questo caso, è necessario utilizzare A C = {{0}, 0};, o meglio

A C{}; // or A C = {}; 

L'unica cosa che mi preoccupa un po 'è il g ++ avviso (-Wextra):

avvertimento : initializer mancante per il membro 'main() :: A :: D' [-Inizializzazioni campo-instabile] AC {0,0};

Ma secondo la mia interpretazione dello standard sopra, dovresti essere OK e D dovrebbe essere stato inizializzato. Ho anche provato con un po 'di collocamento new, e il risultato è come previsto

#include <iostream> 

int main() 
{ 
    struct A { int B[100]; int D;}; 
    A memory{}; 
    memory.D = 42; 
    std::cout << memory.D << std::endl; 

    // let's place something an A at the location of memory 
    A* foo = new (&memory) A{0,0}; 
    // line below outputs 0, so D is erased; not the case if A* foo = new (&memory) A; 
    std::cout << memory.D << std::endl; // outputs 0 
} 
+1

Ho già modificato la domanda, quindi non è più {0}, ma {0,0}. In questo modo rende più chiara la mia effettiva considerazione. – exebook

Problemi correlati