2014-04-07 13 views
6
int main() { 
    int sz = 10; 
    goto end; 
    char bytes[sz]; 
end: 
    return 0; 
} 

से पहले कूदने के लिए गेटो निर्देश मुझे संकलन में निम्न त्रुटि मिलती है। मैं सी 99 मानक के साथ जीसीसी का उपयोग करता हूं।परिवर्तनीय लंबाई सरणी

test.c: In function ‘main’: 
test.c:3:2: error: jump into scope of identifier with variably modified type 
test.c:5:1: note: label ‘end’ defined here 
test.c:4:7: note: ‘bytes’ declared here 

उत्तर

14

यह मानक से मना किया है:

C99 standard, paragraph 6.8.6.1 

Constraints 

[...] A goto statement shall not jump from outside the scope of an identifier having a 
     variably modified type to inside the scope of that identifier. 

आपका goto लाइन जो रनटाइम के दौरान आपके bytes सरणी आवंटित छोड़ देता है। इसकी अनुमति नहीं है।

आप घुंघराले ब्रेसिज़ के साथ आसपास के द्वारा bytes के दायरे को सीमित कर सकता है, goto और लेबल से पहले आवंटन कर दिया, या बिल्कुल भी goto का उपयोग नहीं।

इसे और अधिक स्पष्ट रूप से रखने के लिए, एक बार bytes आवंटित किया गया है, अब आप दायरे के अंदर "अंदर" हैं। आवंटन से पहले, आप दायरे के बाहर "बाहर" हैं। तो आप "दायरे के बाहर से" कूद नहीं सकते "दायरे के अंदर"।

+0

धन्यवाद। एक बार बाइट आवंटित किए जाने के बाद, गुंजाइश कहां समाप्त होती है? लेकिन मैं समझने की कोशिश कर रहा हूं कि संकलक गतिशील सरणी के लिए एक गुंजाइश क्यों शुरू करता है? – sunil

+0

@ सुनील: अंतराल घुमावदार ब्रेस ('}') पर दायरा समाप्त होता है। – Brian

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