2013-06-14 9 views
7
int main() 
{ 
     char *x = "HelloWorld"; 
     char y[] = "HelloWorld"; 

     x[0] = 'Z'; 
     //y[0] = 'M'; 

     return 0; 
} 

उपरोक्त प्रोग्राम में, HelloWorld केवल-पढ़ने वाले अनुभाग (i.e स्ट्रिंग तालिका) में होगा। x उस केवल पढ़ने वाले अनुभाग को इंगित करेगा, इसलिए उन मानों को संशोधित करने का प्रयास अपरिभाषित व्यवहार होगा।फ़ंक्शन पैरामीटर में स्ट्रिंग

लेकिन y स्टैक में आवंटित किया जाएगा और HelloWorld उस स्मृति में कॉपी किया जाएगा। तो वाई संशोधित ठीक काम करेगा।

निम्नलिखित कार्यक्रम में, दोनों char *arr और char arr[] कारणों विभाजन गलती करता है, तो सामग्री संशोधित किया गया है: String literals: pointer vs. char array

यहाँ मेरी प्रश्न है।

void function(char arr[]) 
//void function(char *arr) 
{ 
    arr[0] = 'X'; 
}   
int main() 
{ 
    function("MyString");  
    return 0; 
} 
  1. कैसे यह समारोह पैरामीटर संदर्भ में अलग है?
  2. फ़ंक्शन पैरामीटर के लिए कोई मेमोरी आवंटित नहीं की जाएगी ??

कृपया अपना ज्ञान साझा करें।

+0

संभावित डुप्लिकेट [आकार के सरणी पैरामीटर के रूप में पारित] [http: // stackoverflow।कॉम/प्रश्न/1328223/sizeof-array-pass-as-पैरामीटर) – delnan

+2

वास्तव में सरणी पैरामीटर के आकार की चर्चा से संबंधित नहीं है। यह स्ट्रिंग अक्षर बनाम चरित्र सरणी के कॉन्स्टेस के बारे में है, जो ज्यादातर आकारों से संबंधित नहीं है। –

उत्तर

17

फ़ंक्शन पैरामीटर सूची के अंदर, char arr[] बिल्कुल char *arr के बराबर है, इसलिए परिभाषाओं की जोड़ी और घोषणाओं की जोड़ी बराबर है।

void function(char arr[]) { ... } 
void function(char *arr) { ... } 

void function(char arr[]); 
void function(char *arr); 

समस्या कॉलिंग संदर्भ है। आपने फ़ंक्शन को शाब्दिक स्ट्रिंग प्रदान की है; स्ट्रिंग अक्षर को संशोधित नहीं किया जा सकता है; आपके फ़ंक्शन ने स्ट्रिंग अक्षर को संशोधित करने का प्रयास किया था; आपके कार्यक्रम ने अपरिभाषित व्यवहार का आह्वान किया और दुर्घटनाग्रस्त हो गया। सभी पूरी तरह से कोशेर।

स्ट्रिंग अक्षर का इलाज करें जैसे कि वे static const char literal[] = "string literal"; थे और उन्हें संशोधित करने का प्रयास नहीं करते हैं।

+0

आप सही स्टोरेज अवधि रखने के लिए 'स्थिर कॉन्स चार 'भी कह सकते हैं। – ouah

+0

सच है ... मैं उस मैच से अपडेट करूँगा ... –

+1

वास्तव में, C++ मानक निर्दिष्ट करता है कि स्ट्रिंग अक्षर 'const' हैं। दुर्भाग्यवश, सी मानक नहीं है, संभवतः क्योंकि यह बहुत अधिक विरासत कोड तोड़ देगा, जबकि इन शाब्दिकों को संशोधित नहीं करते समय, इसकी घोषणाओं में मैला है। – microtherion

6
function("MyString"); 

char *s = "MyString"; 
function(s); 

"MyString" के समान है दोनों ही मामलों में एक स्ट्रिंग शाब्दिक में है और दोनों ही मामलों में स्ट्रिंग unmodifiable है।

function("MyString"); 

एक तर्क के रूप में एक स्ट्रिंग function को शाब्दिक का पता गुजरता है।

+0

पहले मामले में, 'हैलोवर्ल्ड' केवल 'char arr []' मामले में अक्षरशः स्ट्रिंग है। सही?? – Jeyaram

+1

पहले कोड खंड में, 'y' के लिए स्ट्रिंग अक्षर एक प्रारंभिक है जिसे स्टैक पर कॉपी किया गया है। यदि फ़ंक्शन को कई बार बुलाया गया था, तो सरणी प्रत्येक आमंत्रण पर शुरू की जाएगी, संभावित रूप से किसी और से निरंतर प्रारंभकर्ता का उपयोग कर। सरणी संशोधित है, यद्यपि। –

1

char * arr; उपरोक्त कथन का तात्पर्य है कि एआर एक चरित्र सूचक है और यह चरित्र के किसी चरित्र या तारों को इंगित कर सकता है

& चार arr []; उपरोक्त कथन का तात्पर्य है कि एआर चरित्र की तार है और जितना संभव हो उतना पात्र या यहां तक ​​कि एक को स्टोर कर सकता है लेकिन हमेशा '\ 0' चरित्र पर भरोसा करेगा, इसलिए इसे एक स्ट्रिंग (जैसे char arr [] = "a" समान है चार arr [] = {'a', '\ 0'})

लेकिन जब फ़ंक्शन नामक पैरामीटर के रूप में उपयोग किया जाता है, तो पारित स्ट्रिंग को औपचारिक तर्कों में चरित्र द्वारा वर्णित चरित्र को कोई फर्क नहीं पड़ता है।

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