2015-05-24 33 views
5

W one of the answers w Tips for golfing in C, widziałem ten kod (wersja ungolfed): (? Ale kogo to obchodzi w kodzie golf)Co otrzymam, jeśli zadeklaruję tablicę bez rozmiaru w zasięgu globalnym?

s[],t; 

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

Myślę, że powyższy program, wykazuje UB. Ale rzeczą, której nie rozumiem, jest globalny zasięg w postaci s[]. Wiem, że gdy typ zmiennej globalnej nie jest określony, domyślnie jest to int. Stworzyłem mały program, który zaskakująco kompiluje:

#include <stdio.h> 

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

choć emituje jedno ostrzeżenie:

prog.c:23:5: warning: array 's' assumed to have one element [enabled by default] 
int s[]; 
    ^
  • Co jest s w powyższym programie? Czy to jest int* czy coś innego?
  • Czy będzie to przydatne w dowolnym miejscu?
+0

's' jest tablicą' int' z określoną liczbą elementów w implementacji? – alk

+0

@alk, Tak, implementacja przydziela pewien rozmiar dla 's'? –

+0

Prawdopodobnie '0' lub' 1'? – alk

Odpowiedz

1

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

s niekompletna typu. Dlatego nie możesz tego zrobić sizeof. Jak sugeruje @BLUEPIXY, jest on inicjalizowany zerą, ponieważ jest zadeklarowany w zasięgu globalnym, tworząc "wstępną definicję".

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.

Teraz

Will this be useful anywhere?

To całkiem bezużyteczny, jeśli jesteś po prostu używając s[0] ponieważ w tym momencie wybrać się na s; bezpośrednio. Ale jeśli potrzebujesz tablicy o określonej wielkości i nie zależy Ci na UB, to jest "w porządku".

+0

Ale to nie jest "* członek struktury *". – alk

+0

Co masz na myśli, @alk? 's' jest niekompletnym typem, który ma być używany jako elastyczny element tablicy. Inne zastosowania nie mają znaczenia. – edmz

+1

Mam na myśli, że ponieważ 's' nie jest" * członkiem struktury * ", cytowany załącznik nie ma zastosowania. Ponadto po C11 Draft 6.9.2/5 (jak już wspomniano przez @BLUEPIXY): Ponieważ 's' jest niekompletnego typu ** i ** w zasięgu globalnym, dostaje implicilty zainicjalizowane za pomocą' ... = {0} '. Więc kończy się jako 'int [1]' z 's [0]' jest równe '0'. – alk