2013-04-22 11 views
7

Nella parte di dati di carico di un programma scritto in linguaggio C, vedo l'inizializzazione di un buffer è fatto in questo modo:In che modo l'inizializzazione utilizzando il buffer [100] = {0,} funziona in linguaggio C?

char buffer[100] = {0, }; 

ma non sono sicuro di quello che i valori vengono assegnati da questa dichiarazione. Si prega di condividere alcune idee.

Questo dipendono dal compilatore o è una caratteristica del linguaggio?

E qual è il punto utilizzando una virgola dopo che lo zero, se questa affermazione è equivalente a:

char buffer[100] = {0}; 

E ', per caso, perché il codificatore vuole solo fare in modo che il primo elemento è zero, e non ti importa del resto?

+3

Non puoi semplicemente controllare i valori di ogni elemento? –

+5

Oh, che sciocco da parte mia. Ma cosa succede se è dipeso dal compilatore o qualcosa del genere? – Cong

+0

Va bene, è tutto '\ 0' per tutti gli elementi dal buffer [0] al buffer [255] (sotto Xcode IDE, Apple LLVM compilatore 4.2). – Cong

risposta

10

Dipende dal compilatore o è una funzione di lingua?

Il comportamento è specificato dallo standard di lingua. L'attuale standard (C11 §6.7.9 Inizializzazione/21, che è a pagina 141) descrive cosa accade quando si fornisce meno inizializzatori di elementi di un aggregato:

Se ci sono meno inizializzatori in una brace- lista allegata che ci sono elementi o membri di un aggregato o meno caratteri in una stringa letterale utilizzato per inizializzare un array di dimensione nota che ci sono elementi nell'array, il resto dell'aggregato è inizializzato implicitamente la stessa come oggetti ha una durata di archiviazione statica.

Pertanto, gli elementi non specificati vengono inizializzati su \0.

+0

Grazie per il riferimento: D – Cong

+0

Ah! nella parte anteriore della Sezione 6.7.9 Inizializzazione di [C11] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf), la sintassi supporta esplicitamente il formato di '{ 0,} 'come' {initializer-list,} '. – Cong

5

I valori dati (un singolo 0 in questo caso) vengono utilizzati e quindi tutti gli altri membri sono pieni di zeri.

Aveva hai detto char buffer[100] = {1, };, l'array conterrebbe un 1 e 99 zeri.

+0

Questo è il buon esempio che volevo! – Cong

4

buffer[100] = {literal, } inizializza il primo elemento al valore letterale e il resto per 0 .On invece buffer[100] = {0} inizializza tutti gli elementi per 0 codice .Your è equivalente a buffer[100] = {0} sia come inizializzare tutti elementts a 0.RichieHindle di buffer[100] = {1, } illustra l'intera punto.

+0

spiegazione molto chiara. Grazie! – Cong

1

Initializers per una matrice di una data dimensione sono assegnati a membri di matrice su base uno-a-uno. Se sono presenti troppo pochi inizializzatori per tutti i membri, i membri rimanenti vengono inizializzati su 0. Elencare troppi inizializzatori per un determinato array di dimensioni è un errore.

+0

Grazie per aver condiviso le tue intuizioni, malefica. – Cong

Problemi correlati