सी मानक की गारंटी है कि size_tएक प्रकार है जो किसी भी सरणी सूचकांक पकड़ सकता है। इसका मतलब है कि, तार्किक रूप से, size_tकिसी भी सूचक प्रकार को धारण करने में सक्षम होना चाहिए। मैंने कुछ साइटों पर पढ़ा है जो मुझे गोगल्स पर मिली हैं कि यह कानूनी है और / या हमेशा काम करना चाहिए:
void *v = malloc(10);
size_t s = (size_t) v;
तो फिर C99 में, मानक ने प्रकार intptr_tऔर uintptr_tप्रकार पेश किए, जिन पर हस्ताक्षर किए गए और अहस्ताक्षरित प्रकार इंगित करने में सक्षम हैं:
uintptr_t p = (size_t) v;
तो उपयोग करने के बीच अंतर क्या है size_tऔर uintptr_t? दोनों अहस्ताक्षरित हैं, और दोनों को किसी भी सूचक प्रकार को रखने में सक्षम होना चाहिए, इसलिए वे कार्यात्मक रूप से समान लगते हैं। क्या स्पष्टता के अलावा, इसके बजाय uintptr_t(या बेहतर अभी तक void *) का उपयोग करने के लिए कोई वास्तविक सम्मोहक कारण है size_t? एक अपारदर्शी संरचना में, जहां क्षेत्र को केवल आंतरिक कार्यों द्वारा नियंत्रित किया जाएगा, क्या ऐसा करने का कोई कारण नहीं है?
एक ही टोकन द्वारा, ptrdiff_tएक हस्ताक्षरित प्रकार सूचक मतभेदों को रखने में सक्षम है, और इसलिए किसी भी सूचक को रखने में सक्षम है, इसलिए यह किस प्रकार से अलग है intptr_t?
इन सभी प्रकारों में मूल रूप से एक ही फ़ंक्शन के तुच्छ रूप से अलग-अलग संस्करण नहीं हैं? यदि नहीं, तो क्यों? मैं उनमें से एक के साथ क्या नहीं कर सकता जो मैं दूसरे के साथ नहीं कर सकता? यदि हां, तो C99 ने भाषा में दो अनिवार्य रूप से शानदार प्रकार क्यों जोड़े?
मैं फ़ंक्शन पॉइंटर्स की अवहेलना करने के लिए तैयार हूं, क्योंकि वे वर्तमान समस्या पर लागू नहीं होते हैं, लेकिन उनका उल्लेख करने के लिए स्वतंत्र महसूस करते हैं, क्योंकि मुझे एक संदेह है कि वे "सही" उत्तर के लिए केंद्रीय होंगे।
size_tऔरuintptr_tलेकिन क्या बारे मेंptrdiff_tऔरintptr_t- नहीं इन दोनों को लगभग किसी भी मंच पर मूल्यों की एक ही श्रेणी की दुकान करने में सक्षम होगा? क्यों हस्ताक्षरित और अहस्ताक्षरित सूचक आकार पूर्णांक प्रकार दोनों हैं, खासकर अगरptrdiff_tपहले से ही हस्ताक्षरित सूचक आकार पूर्णांक प्रकार के उद्देश्य से कार्य करता है।