2015-05-24 11 views
5

In one of the answers in Tips for golfing in C, ho visto questo codice (versione ungolfed): (? Ma che importa in campo da codice)Cosa ottengo se dichiaro un array senza una dimensione nell'ambito globale?

s[],t; 

main(c){ 
    for(scanf("%*d "); ~(c=getchar()); s[t++]=c) 
     putchar(s[t]); 
} 

Credo che il programma di cui sopra presenta UB. Ma la cosa che non capisco è lo s[] nell'ambito globale. So che quando il tipo di una variabile globale non viene specificato, per impostazione predefinita è int. Ho creato un piccolo programma che raccoglie sorprendentemente:

#include <stdio.h> 

int s[]; 
int main(void) 
{ 
    printf("Hello!"); 
} 

se emette un avvertimento:

prog.c:23:5: warning: array 's' assumed to have one element [enabled by default] 
int s[]; 
    ^
  • Ciò che è s nel programma di cui sopra? È un int* o qualcos'altro?
  • Sarà utile ovunque?
+0

's' è una matrice di' int' con un numero definito di elementi di implementazione? – alk

+0

@alk, Quindi, un'implementazione alloca alcune dimensioni per 's'? –

+0

Probabilmente '0' o' 1'? – alk

risposta

1

What is s in the above program? Is it an int* or something else?

s è un tipo incompleto. Ecco perché non puoi farlo sizeof. Come suggerisce @BLUEPIXY, è inizializzato con zero perché è dichiarato nell'ambito globale come "definizione provvisoria".

int i[];
the array i still has incomplete type, the implicit initializer causes it to have one element, which is set to zero on program startup.

Ora,

Will this be useful anywhere?

E 'abbastanza inutile se si sta usando solo s[0] perché a quel punto si va per s; direttamente. Ma se hai bisogno di un array con una certa dimensione e non ti interessa di UB, è "ok".

+0

Ma non è un "* membro della struttura *". – alk

+0

Cosa intendi, @alk? 's' è un tipo incompleto che dovrebbe essere usato come membro di un array flessibile. Altri usi non hanno significato. – edmz

+1

Voglio dire che come 's' non è un" * membro di una struttura * "l'appendice citata non si applica. Inoltre, seguendo il C11 Draft 6.9.2/5 (come già menzionato da @BLUEPIXY): Siccome 's' è di tipo incompleto ** e ** in ambito globale viene inizializzato in modo implicito con' ... = {0} '. Quindi finisce con 'int [1]' con 's [0]' uguale a '0'. – alk