मैं सी सीखने की प्रक्रिया में हूं। मेरे पास एक विधि है जो 3 स्ट्रिंग लेती है और उन्हें कुछ ऑपरेशन करने के लिए जोड़ती है। जीसीसी कंपाइलर का उपयोग करके मेरा पहला कार्यान्वयन निम्नलिखित था।स्ट्रिंग मैनिपुलेशन और मेमोरी आवंटन - सी
void foo(const char *p1, const char *p2, const char *p3)
{
size_t length = strlen(p1) + strlen(p2) + strlen(p3);
char combined[length + 1];
memset(combined, 0, length + 1);
strcat(combined, p1);
strcat(combined, p2);
strcat(combined, p3);
printf("Result : %s", combined);
}
int main()
{
foo("hello ", "world ", "how");
return 0;
}
यह अच्छी तरह से काम करता है। लेकिन जब मैंने इसे cc -Wall -pedantic -g foo.c -o foo
का उपयोग करके संकलित किया, तो मुझे ISO C90 forbids variable length array ‘combined’
जैसी चेतावनियां मिलनी शुरू हुईं। एमएसवीसी इस कोड को संकलित नहीं कर रहा था। बदल दिया तरह
void foo(const char *p1, const char *p2, const char *p3)
{
size_t length = strlen(p1) + strlen(p2) + strlen(p3);
char *combined = (char *) malloc(length + 1);
memset(combined, 0, length + 1);
strcat(combined, p1);
strcat(combined, p2);
strcat(combined, p3);
printf("Result : %s", combined);
free(combined);
}
प्रश्न
- कोड यह सही कार्यान्वयन है?
- यदि परिवर्तनीय लंबाई सरणी मानक का हिस्सा नहीं हैं, तो जीसीसी ने इसे क्यों लागू किया? यदि कोड केवल जीसीसी पर संकलित होने की उम्मीद है, तो परिवर्तनीय सरणी का उपयोग मॉलोक का उपयोग करने से बेहतर विकल्प होगा?
- मुझे लगता है कि अंगूठे नियम है, अगर स्मृति आवश्यक है संकलन समय पर जानता है, तो सरणी का उपयोग करें और आवश्यक स्मृति आवंटित करने के लिए malloc का उपयोग करें। क्या ये सही है?
- मेरा कोड जीसीसी और एमएसवीसी पर संकलित होने की उम्मीद है। मैं आमतौर पर जीसीसी पर विकास कर रहा हूं। तो संकलक झंडे क्या हैं जो अधिकतम पोर्टेबिलिटी सुनिश्चित करता है? वर्तमान में मैं
-Wall -pedantic
का उपयोग कर रहा हूं। क्या मुझे-ansi
का भी उपयोग करना चाहिए? एमएसवीसी में उपलब्ध समकक्ष झंडे क्या होंगे? - पोर्टेबल सी कोड लिखते समय विचार करने वाली अन्य आम बातों क्या हैं?
http: // stackoverflow देखें।कॉम/प्रश्न/30 9 3049/अलग-व्यवहार-के-कंपाइलर्स-साथ-सरणी आवंटन – PeterK
(1) हां यह है, जैसा कि आपने बिंदु 3 (2) में उल्लेख किया है क्योंकि जीसीसी आईएसओ सी 0 9 के अलावा अन्य मानकों का भी समर्थन करता है। (5) http://www.google.com/search?q=writing+portable+C+code वीएलए को गतिशील रूप से आवंटित करना हमेशा बेहतर होता है क्योंकि आप (एम/सी) आवंटन के वापसी मूल्य की जांच कर सकते हैं देखें कि आवंटन सफल था या नहीं – itisravi
@itisravi - आपको टिप्पणी में जवाब देने के बजाय जवाब देना चाहिए। टिप्पणी लंबाई प्रतिबंधों के कारण, वीएलए बनाम गतिशील आवंटन पर आपकी सिफारिश थोड़ा सा स्पैस है। मैं इसके साथ सहमत हूं, और मुझे पता है कि आप क्या प्राप्त कर रहे हैं, लेकिन यह अस्पष्ट है क्योंकि टिप्पणियों के उत्तर बहुत कम हैं। यही कारण है कि हमारे पास जवाब हैं। ;) –