2015-05-24 8 views
5

In one of the answers in Tips for golfing in C, habe ich diesen Code (ungolfed Version): (aber wer in Code Golf kümmert)Was bekomme ich, wenn ich ein Array ohne globale Größe deklariere?

s[],t; 

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

Ich denke, dass das obige Programm UB aufweist. Aber die Sache, die ich nicht verstehe, ist die s[] im globalen Umfang. Ich weiß, dass, wenn der Typ einer globalen Variablen nicht angegeben ist, der Standardwert int ist. Ich habe ein kleines Programm, das überraschend kompiliert:

#include <stdio.h> 

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

obwohl es eine Warnung aussendet:

prog.c:23:5: warning: array 's' assumed to have one element [enabled by default] 
int s[]; 
    ^
  • Was s in dem obigen Programm ist? Ist es ein int* oder etwas anderes?
  • Wird dies überall nützlich sein?
+0

's' ist ein Array von' int' mit einer Implementierung definierten Anzahl von Elementen? – alk

+0

@alk, also weist eine Implementierung etwas Größe für 's' zu? –

+0

Wahrscheinlich "0" oder "1"? – alk

Antwort

1

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

s ist ein unvollständiger Typ. Deshalb können Sie nicht sizeof es. Wie @BLUEPIXY andeutet, wird es mit Null initialisiert, da es im globalen Gültigkeitsbereich deklariert wird, was eine "vorläufige Definition" ergibt.

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.

Jetzt

Will this be useful anywhere?

Es ist ziemlich nutzlos, wenn Sie nur s[0] an diesem Punkt, weil mit Ihnen direkt gehen für s;. Aber wenn Sie ein Array mit einer bestimmten Größe brauchen und Sie sich nicht um UBs kümmern, ist es "okay".

+0

Aber es ist kein "* Mitglied der Struktur *". – alk

+0

Was meinst du, @alk? "s" ist ein unvollständiger Typ, der als flexibles Array-Element verwendet werden soll. Andere Verwendungen haben keine Bedeutung. – edmz

+1

Ich meine, dass 's' kein" * Mitglied einer Struktur * "ist. Der angeführte Anhang gilt nicht. Außerdem folgt der C11 Draft 6.9.2/5 (wie bereits von @BLUEPIXY erwähnt): Da 's' vom unvollständigen Typ ** und ** im globalen Gültigkeitsbereich ist, wird die Implizitität mit '... = {0}' initialisiert. Also endet es als 'int [1] 'mit' s [0] 'ist gleich' 0'. – alk