2015-05-24 19 views
5

Tips for golfing in C yılında one of the answers, ben bu kodu (ungolfed versiyonu) gördü: (? Ama kim kod golf umurunda) Ben yukarıdaki program UB sergiler düşünüyorumGenel kapsamda boyutsuz bir dizi bildirirsem ne alırım?

s[],t; 

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

. Ama anlamadığım şey, global kapsamda s[]. Genel değişken belirtilmemişse, varsayılan değer olarak int olduğunu biliyorum.

#include <stdio.h> 

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

o bir uyarı yayar olsa:

prog.c:23:5: warning: array 's' assumed to have one element [enabled by default] 
int s[]; 
    ^
  • yukarıdaki programda s nedir ben şaşırtıcı derler küçük bir program oluşturdu? int* veya başka bir şey mi?
  • Bu herhangi bir yerde yararlı olacak mı?
+0

's', bir öğe tanımlanmış uygulama sayısı ile bir 'int 'dizisidir? – alk

+0

@alk, Yani, bir uygulama 's' için bazı boyut ayırır? –

+0

Muhtemelen '0' veya' 1'? – alk

cevap

1

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

s tamamlanmamış türüdür. Bu yüzden sizeof yapamazsınız. @BLUEPIXY tarafından önerildiği gibi, global kapsamda "geçici bir tanım" yapması nedeniyle sıfır ile başlatılır. Şimdi

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.

, sadece s[0] kullanıyorsanız Çünkü doğrudan s; gitmek bu noktada oldukça işe yaramaz

Will this be useful anywhere?

. Ancak, belirli bir boyuta sahip bir diziye ihtiyacınız varsa ve UB'leri umursamıyorsanız, "tamam" dır.

+0

Fakat bu bir "* yapı elemanı *" değil. – alk

+0

Ne demek, @alk? 's' esnek dizi üyesi olarak kullanılması gereken eksik bir türüdür. Diğer kullanımlar anlamsızdır. – edmz

+1

Demek istediğim, "bir yapının * üyesi değil", belirtilen ek geçerli değildir. Ayrıca, C11 Taslak 6.9.2/5'i (@BLUEPIXY tarafından daha önce belirtildiği gibi) takip ederek: '' ', ** ve ** 'nin tamamlanmamış tipte olduğunu ve global kapsamda'… = {0} 'ile başlatılan implicilty değerini alır. Yani '[0]' '[0]' '0' 'a eşit olacak şekilde biter. – alk

İlgili konular