2011-12-24 6 views

risposta

9

Né C né C++ consentono matrici di lunghezza zero, quindi il programma è mal formato.

(Es C++ 11, 8.3.4/1: "[la dimensione dell'array] deve essere maggiore di zero".)

(Come un punto di logica: Un array di lunghezza zero sarebbe difficile e confondendo per riconciliare con il requisito che ogni oggetto abbia un indirizzo univoco.)

Come @sidyll indica, gli array a lunghezza zero sono disponibili come extension in GCC.

+0

non sta dando errore nel compilatore gcc ubuntu 10.04 –

+4

@ user1044137: Ci sono molti, molti, molti modi per scrivere sia i programmi C che C++ che sono mal formati e per i quali non si riceve alcuna diagnosi. Del resto, il mio GCC dice "attenzione: ISO C++ proibisce l'array a dimensione zero". Dovresti sempre abilitare tutti gli avvertimenti. –

+1

Perché stai compilando un programma ** C ** da una domanda ** C ** con un compilatore ** C++ ** e postando un estratto standard ** C++ **? – sidyll

3

Troverete la vostra risposta in The GCC manual

Se si utilizza C99

  • membri di matrice flessibili sono scritti come contenuto [] senza i 0.
  • membri di matrice flessibili hanno incompleta digitare, quindi non è possibile applicare l'operatore sizeof. Come un capriccio dell'implementazione originale di array a lunghezza zero, sizeof valuta zero.
  • I membri della matrice flessibile possono apparire solo come l'ultimo membro di una struttura che non è altrimenti vuota.
  • Una struttura contenente un membro di matrice flessibile o un'unione contenente tale struttura (eventualmente in modo ricorsivo), potrebbe non essere un membro di una struttura o di un elemento di una matrice. (Tuttavia, questi usi sono consentiti da GCC come estensioni

E, naturalmente, come possono essere utili:.

array di lunghezza zero sono ammessi in GNU C. Essi sono molto utili come ultimo elemento di una struttura che è davvero un'intestazione per un oggetto di lunghezza variabile:

struct line { 
    int length; 
    char contents[0]; 
}; 

struct line *thisline = (struct line *) 
    malloc (sizeof (struct line) + this_length); 
thisline->length = this_length; 
+1

In C11 e in C99, 'sizeof' non è sempre un operatore in fase di compilazione (era solo in C89). –

1

non c'è più l'uso come indicato nel tuo esempio, ma matrice di dimensione pari a zero s sono stati spesso utilizzati nelle strutture dove l'ultimo elemento è stato dinamicamente dimensioni:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [0]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long * s.n_variable_elements; 

L'utilizzo di una matrice di lunghezza zero è:

1) variable_elements ha un indirizzo (nonostante risposta di qualcuno)
2) ha anche semantica matrice
3) calcolare la dimensione dinamica della matrice è semplificata

Sfortunatamente, alcuni compilatori (MSC) getterebbe un attacco sibilante su una tale costruzione e forzare un minore, calmare, tecnicamente corretto riformulazione:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [1]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long + (s.n_variable_elements - 1); 

Pensare a un array di dimensioni zero come segnaposto. Non è più necessario farlo, a meno che non si sia costretti a utilizzare C, come in molti ambienti incorporati.

Problemi correlati