दिलचस्प पोस्ट
अजगर में प्रधान संख्याओं की प्रिंट श्रृंखला आईओएस में विंडोज प्रमाण पत्र के साथ सीओआरएस अनुरोध के लिए 401 प्रतिक्रिया बाइट सरणी को बिटमैप कन्वर्ट करने के लिए कैसे करें CKEditor उदाहरण पहले से मौजूद है टिप्पणियों की संख्या के साथ साजिश का विवरण देने के लिए stat_summary का उपयोग करें अजगर शब्दकोश के तत्वों तक पहुंच अजगर का आदेश दिया तत्व क्रम नहीं रखते हुए क्या एचटीएमएल 5 वैध एक्सएमएल है? कोष्ठक के साथ मेरे और केवल एक चर का उपयोग करना रेल कई कई स्वयं शामिल होने के लिए मैं अपने खुद के कोड में Google क्रोम 11 की अपलोड फ़ोल्डर सुविधा का उपयोग कैसे करूं? शेल स्क्रिप्ट में किसी अन्य स्ट्रिंग के लिए एक उपस्ट्रिंग बदलें कैसे एक .html पृष्ठ से लिंक और खिताब निकालने के लिए? अजगर के भीतर से कमांड लाइन प्रोग्राम निष्पादित करना एंड्रॉइड – टाइमर और टाइमरटस्क के साथ काम को नियंत्रित करना?

चार * 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";

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

Solutions Collecting From Web of "चार * 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 को मेमोरी में एक मेमोरी सौंपी जाती है, मान 'परीक्षा' इसमें भरी हुई है