ऐसा लगता है कि strtol()
और strtod()
प्रभावी रूप से अनुमति देते हैं (और बल) यदि आप एक स्ट्रिंग में constness दूर कास्ट करने के लिए:स्ट्रेटोल हैं, स्ट्रैट असुरक्षित हैं?
#include <stdlib.h>
#include <stdio.h>
int main() {
const char *foo = "Hello, world!";
char *bar;
strtol(foo, &bar, 10); // or strtod(foo, &bar);
printf("%d\n", foo == bar); // prints "1"! they're equal
*bar = 'X'; // segmentation fault
return 0;
}
ऊपर, मैं प्रदर्शन नहीं किया था किसी भी अपने आप को डाले। हालांकि, strtol()
मूल रूप से मेरे const char *
को मेरे लिए char *
में किसी भी चेतावनी या किसी भी चीज़ के बिना डाला गया। (वास्तव में, यह आपको bar
को const char *
के रूप में टाइप करने की अनुमति नहीं देगा, और इसलिए असुरक्षित परिवर्तन को प्रकार में मजबूर करता है।) क्या यह वास्तव में खतरनाक नहीं है?
लेकिन सी ++ आपको फ़ंक्शन को ओवरलोड करने से नहीं रोकता है: आपके पास 'long int strtol (char * nptr, char ** endptr, int base) हो सकता है; '* और *' long int strtol (const char * nptr, const char ** endptr, int base); ': यह आपकी संकलन त्रुटि को हल करता है। दरअसल, यह मानक ऐसे अन्य कार्यों के लिए करता है, जैसे 'strchr' और' strstr', – Thanatos
आप सी अकसर किये गए सवाल वेब साइट का संदर्भ ले सकते हैं ['const char * p',' char const * p' के बीच क्या अंतर है, और 'char * const p'?] (http://c-faq.com/ansi/constptrconst.html) और, विशेष रूप से, [मैं एक समारोह में' char ** 'क्यों नहीं पारित कर सकता हूं जो' सी ++ एफएक्यू के बजाय कॉन्स char ** '?] (http://c-faq.com/ansi/constmismatch.html), हालांकि मुझे पूर्ण विश्वास नहीं है कि स्पष्टीकरण को समझना आसान है। –