दिलचस्प पोस्ट
UILocalNotification रद्द करें पृष्ठभूमि कार्यकर्ता को तर्क भेजना? प्रबंधित वस्तु प्रॉपर्टी बदलना तालिका दृश्य को अपडेट करने के लिए NSFetchedResultsController को ट्रिगर नहीं करता है JQuery के साथ HTML स्ट्रिंग से बचें फ़ंक्शन पॉइंटर के डीरेंसिंग कैसे होता है? एक स्थान समान स्ट्रिंग की पहचान की तुलना क्यों करता है? imagemagick के लिए क्यों फ़ॉन्ट सूची खाली है? क्या PHP सत्रों की मेरी समझ सही है? जावा में कीप्रेस को सुनने के दौरान छवि को कैसे स्थानांतरित किया जाए एएसएएस और एसडीओ के माध्यम से एमएक्स के साथ फाइल खोलें अजगर: सूची बनाम ट्यूपल, प्रत्येक का उपयोग करने के लिए कब? क्या कैमरा के साथ ऑब्जेक्ट की दूरी तय करना संभव है? WPF में मौजूदा नियंत्रणों के लिए नियंत्रण टेम्पलेट जिन्जा एक्सप्रेशन के संदर्भ टेम्पलेट वैरिएबल आरडीएल रिपोर्ट पर आरडीएलसी का उपयोग कब करना है?

चार * str = "STRING" के बीच अंतर और चार अक्ष = "STRING"?

एक स्ट्रिंग से एक विशेष वर्ण को निकालने के लिए एक साधारण फ़ंक्शन को कोड करते हुए, मैं इस अजीब मुद्दे पर गिर गया:

void str_remove_chars( char *str, char to_remove) { if(str && to_remove) { char *ptr = str; char *cur = str; while(*ptr != '\0') { if(*ptr != to_remove) { if(ptr != cur) { cur[0] = ptr[0]; } cur++; } ptr++; } cur[0] = '\0'; } } int main() { setbuf(stdout, NULL); { char test[] = "string test"; // stack allocation? printf("Test: %s\n", test); str_remove_chars(test, ' '); // works printf("After: %s\n",test); } { char *test = "string test"; // non-writable? printf("Test: %s\n", test); str_remove_chars(test, ' '); // crash!! printf("After: %s\n",test); } return 0; } 

मुझे क्या नहीं मिलता है क्यों कि दूसरी परीक्षा में विफल रहता है? मुझे यह पहला संकेतन char *ptr = "string"; जैसा दिखता है char *ptr = "string"; यह एक के बराबर है: char ptr[] = "string";

क्या यह मामला नहीं है?

वेब के समाधान से एकत्रित समाधान "चार * str = "STRING" के बीच अंतर और चार अक्ष = "STRING"?"

दो घोषणाएं समान नहीं हैं

char ptr[] = "string"; आकार के एक चार सरणी की घोषणा करता है और वर्णों के साथ इसे आरंभ करता है
s , t , r , i , n , g और \0 आपको इस सरणी की सामग्री को संशोधित करने की अनुमति है

char *ptr = "string"; ptr को एक चार सूचक के रूप में घोषित करता है और स्ट्रिंग शब्द "string" पते के साथ आरंभ करता है जो केवल पढ़ने के लिए है स्ट्रिंग शब्दशः को संशोधित करना एक अपरिभाषित व्यवहार है । आपने जो देखा (seg गलती) अपरिभाषित व्यवहार का एक अभिव्यक्ति है

सच्चाई से char *ptr एक घोषणापत्र के साथ ही वर्ण के प्रकार के लिए एक संकेतक की गारंटी देता है। संकलित एप्लिकेशन के कोड सेगमेंट के हिस्से के रूप में स्ट्रिंग के लिए यह असामान्य नहीं है, जिसे कुछ ऑपरेटिंग सिस्टम द्वारा केवल पढ़ने के लिए सेट किया जाएगा। समस्या यह है कि आप पहले से परिभाषित स्ट्रिंग की प्रकृति के बारे में एक धारणा बना रहे हैं (यह लिखना योग्य है) जब वास्तव में, आपने अपने आप को उस स्ट्रिंग के लिए स्पष्ट रूप से कभी नहीं बनाया है संभव है कि कंपाइलर और ऑपरेटिंग सिस्टम के कुछ कार्यान्वयन आपको जो करने की कोशिश कर रहे हैं, वह करने के लिए आपको अनुमति देगा।

दूसरी ओर परिभाषा के द्वारा, char test[] की घोषणा char test[] , वास्तव में इस मामले में स्टैक पर वर्णों की पूरी सरणी के लिए पठनीय और लिखने योग्य मेमोरी आवंटित करता है।

char *test = "string test"; गलत है, यह const char* होना चाहिए था const char* यह कोड केवल पिछड़े comptability कारणों के कारण संकलित। const char* द्वारा इंगित स्मृति केवल पढ़ने के लिए स्मृति है और जब भी आप इसे लिखने की कोशिश करते हैं, तो यह अनिर्धारित व्यवहार को लागू करेगा। दूसरी ओर char test[] = "string test" स्टैक पर एक लेखन योग्य वर्ण सरणी बनाता है। यह किसी अन्य रेग्युलर लोकल वैरिएबल की तरह है, जिसे आप लिख सकते हैं।

जहां तक ​​मुझे याद है

 char ptr[] = "string"; 

स्टैक पर "string" की एक प्रति बनाता है, इसलिए यह एक अस्थिर है

फार्म

 char *ptr = "string"; 

केवल पीछे की संगतता के लिए है

 const char *ptr = "string"; 

और आपको इसकी सामग्री को संशोधित करने की अनुमति नहीं है (अपरिभाषित व्यवहार के मामले में) कंपाइलर ऐसी स्ट्रिंग को स्मृति के केवल पढ़ने वाले अनुभाग में रख सकता है।

अच्छा जवाब @ कोडदिक्ट

इसके अलावा, एक sizeof(ptr) विभिन्न घोषणाओं के लिए अलग-अलग परिणाम देगा।

पहले एक, सरणी घोषणा, सरणी की लंबाई को समाप्त कर देगा जिसमें निरर्थक नल वर्ण शामिल है।

दूसरा, char* ptr = "a long text..."; एक सूचक की लंबाई, आमतौर पर 4 या 8 लौटाएगा।

 char *str = strdup("test"); str[0] = 'r'; 

उचित कोड है और एक अस्थायी स्ट्रिंग बनाता है। str को मेमोरी में एक मेमोरी सौंपी जाती है, मान 'परीक्षा' इसमें भरी हुई है