2015-05-24 10 views
5

Tips for golfing in C में one of the answers में, मैं इस कोड (ungolfed संस्करण) को देखा: (? लेकिन जो कोड गोल्फ में परवाह करता है)यदि मैं वैश्विक दायरे में आकार के बिना सरणी घोषित करता हूं तो मुझे क्या मिलेगा?

s[],t; 

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

मुझे लगता है कि उपरोक्त कार्यक्रम दर्शाती यूबी। लेकिन जिस चीज को मैं समझ नहीं पा रहा हूं वह s[] वैश्विक दायरे में है। मुझे पता है कि जब वैश्विक चर का प्रकार निर्दिष्ट नहीं होता है, तो यह int पर डिफ़ॉल्ट होता है।

#include <stdio.h> 

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

हालांकि यह एक चेतावनी का उत्सर्जन करता है:

prog.c:23:5: warning: array 's' assumed to have one element [enabled by default] 
int s[]; 
    ^
  • उपरोक्त कार्यक्रम में s क्या है मैं एक छोटे से प्रोग्राम है जो आश्चर्यजनक रूप से संकलित बनाया? क्या यह int* या कुछ और है?
  • क्या यह कहीं भी उपयोगी होगा?
+0

's' तत्वों की कार्यान्वयन परिभाषित संख्या के साथ' int' की एक सरणी है? – alk

+0

@alk, तो, एक कार्यान्वयन 's' के लिए कुछ आकार आवंटित करता है? –

+0

शायद '0' या' 1'? – alk

उत्तर

1

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

s एक अधूरी प्रकार है। यही कारण है कि आप sizeof नहीं कर सकते हैं। जैसा कि @BLUEPIXY सुझाव देता है, इसे शून्य के साथ प्रारंभ किया गया है क्योंकि इसे वैश्विक क्षेत्र में "टेटेटिव परिभाषा" घोषित किया गया है।

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.

अब

,

Will this be useful anywhere?

यह क्योंकि उस समय आप s; के लिए सीधे जाने पर बहुत बेकार है अगर आप सिर्फ s[0] उपयोग कर रहे हैं। लेकिन, अगर आपको किसी निश्चित आकार के साथ सरणी की आवश्यकता है और आपको यूबी की परवाह नहीं है, तो यह "ठीक है"।

+0

लेकिन यह "संरचना का सदस्य * नहीं है"। – alk

+0

आपका क्या मतलब है, @alk? 's' एक अपूर्ण प्रकार है जिसे लचीला सरणी सदस्य के रूप में उपयोग किया जाना चाहिए। अन्य उपयोगों का कोई मतलब नहीं है। – edmz

+1

मेरा मतलब है कि 's' एक संरचना * * * संरचना का सदस्य नहीं है" जैसा कि परिशिष्ट उद्धृत किया गया है लागू नहीं होता है। इसके अलावा सी 11 ड्राफ्ट 6.9.2/5 (जैसा कि पहले से ही @BLUEPIXY द्वारा उल्लिखित है) के बाद: जैसा कि 's' अपूर्ण प्रकार ** और ** वैश्विक दायरे में है, यह '... = {0}' के साथ प्रारंभिक प्रत्यारोपण प्राप्त करता है। तो यह 'int [1] 'के रूप में समाप्त होता है [0]' '0 के बराबर है। – alk

संबंधित मुद्दे

 संबंधित मुद्दे