c - सी में size_t क्या है?




int size-t (7)

size_t हस्ताक्षरित पूर्णांक डेटा प्रकार है। जीएनयू सी लाइब्रेरी का उपयोग कर सिस्टम पर, यह हस्ताक्षरित int या हस्ताक्षरित लंबी int होगा। size_t आमतौर पर सरणी अनुक्रमण और लूप गिनती के लिए उपयोग किया जाता है।

मैं सी में size_t साथ भ्रमित हो रहा हूं। मुझे पता है कि यह sizeof ऑपरेटर द्वारा वापस आ गया है। लेकिन वास्तव में यह क्या है? क्या यह एक डेटा प्रकार है?

मान लें कि मेरे पास लूप है:

for(i = 0; i < some_size; i++)

क्या मुझे int i; उपयोग करना चाहिए int i; या size_t i; ?


आम तौर पर, यदि आप 0 से शुरू कर रहे हैं और ऊपर की ओर बढ़ रहे हैं, तो हमेशा एक अप्रत्याशित प्रकार का उपयोग करें ताकि आप एक नकारात्मक मूल्य स्थिति में ले जा सकें। यह गंभीर रूप से महत्वपूर्ण है, क्योंकि यदि आपकी सरणी सीमाएं आपके लूप के अधिकतम से कम होती हैं, लेकिन आपका लूप अधिकतम आपके प्रकार के अधिकतम से अधिक होता है, तो आप नकारात्मक के आसपास लपेटेंगे और आपको सेगमेंटेशन गलती का अनुभव हो सकता है (SIGSEGV )। तो, सामान्य रूप से, 0 से शुरू होने और ऊपर की तरफ जाने वाले लूप के लिए कभी भी int का उपयोग न करें। एक हस्ताक्षरित का प्रयोग करें।


मेरी समझ से, size_t एक unsigned पूर्णांक है जिसका बिट आकार देशी वास्तुकला के सूचक को पकड़ने के लिए काफी बड़ा है।

इसलिए:

sizeof(size_t) >= sizeof(void*)

विकिपीडिया से :

1 999 आईएसओ सी मानक (सी 99) के अनुसार, size_t कम से कम 16 बिट का एक हस्ताक्षरित पूर्णांक प्रकार है (अनुभाग 7.17 और 7.18.3 देखें)।

size_t कई सी / सी ++ मानकों द्वारा परिभाषित एक हस्ताक्षरित डेटा प्रकार है, उदाहरण के लिए सी 99 आईएसओ / आईईसी stddef.h मानक, जिसे stddef.h में परिभाषित किया stddef.h1 इसे stdlib.h को शामिल करके और आयात किया जा सकता है क्योंकि इस फ़ाइल में आंतरिक रूप से उप stddef.h शामिल है।

इस प्रकार का उपयोग ऑब्जेक्ट के आकार का प्रतिनिधित्व करने के लिए किया जाता है। लाइब्रेरी फ़ंक्शंस जो आकार लेते हैं या वापस करते हैं, उन्हें उम्मीद है कि वे प्रकार के हों या size_t का रिटर्न प्रकार हो। इसके अलावा, सबसे अधिक इस्तेमाल किए जाने वाले कंपाइलर-आधारित ऑपरेटर आकार को निरंतर मान का मूल्यांकन करना चाहिए जो size_t के साथ संगत है।

एक निहितार्थ के रूप में, size_t एक सरणी अनुक्रमणिका रखने के लिए गारंटीकृत एक प्रकार है।


size_t एक प्रकार है जो किसी भी सरणी अनुक्रमणिका को पकड़ सकता है।

कार्यान्वयन के आधार पर, यह इनमें से कोई भी हो सकता है:

unsigned char

unsigned short

unsigned int

unsigned long

unsigned long long

यहां बताया गया है कि मेरी मशीन के stddef.h में size_t कैसे परिभाषित किया गया है:

typedef unsigned long size_t;

size_t एक हस्ताक्षरित प्रकार है। इसलिए, यह किसी भी नकारात्मक मान (<0) का प्रतिनिधित्व नहीं कर सकता है। जब आप कुछ गिनती करते हैं तो आप इसका इस्तेमाल करते हैं, और यह सुनिश्चित कर लें कि यह नकारात्मक नहीं हो सकता है। उदाहरण के लिए, strlen() एक size_t देता है क्योंकि स्ट्रिंग की लंबाई कम से कम 0 होनी चाहिए।

आपके उदाहरण में, यदि आपका लूप इंडेक्स हमेशा 0 से अधिक होने वाला है, तो यह size_t , या किसी अन्य हस्ताक्षरित डेटा प्रकार का उपयोग करने के लिए समझ में आता है।

जब आप size_t ऑब्जेक्ट का उपयोग करते हैं, तो आपको यह सुनिश्चित करना होगा कि अंकगणित समेत सभी संदर्भों में, आप गैर-ऋणात्मक मान चाहते हैं। उदाहरण के लिए, मान लें कि आपके पास है:

size_t s1 = strlen(str1);
size_t s2 = strlen(str2);

और आप str2 और str1 की लंबाई का अंतर खोजना चाहते हैं। आप ऐसा नहीं कर सकते हैं:

int diff = s2 - s1; /* bad */

ऐसा इसलिए है क्योंकि diff को आवंटित मान हमेशा सकारात्मक संख्या होने जा रहा है, भले ही s2 < s1 , क्योंकि गणना हस्ताक्षरित प्रकारों के साथ की जाती है। इस मामले में, आपके उपयोग के मामले के आधार पर, आप s1 और s1 लिए int (या long long ) का उपयोग करना बेहतर हो सकते हैं।

सी / पॉज़िक्स में कुछ फ़ंक्शन हैं जो size_t उपयोग / उपयोग कर सकते हैं, लेकिन ऐतिहासिक कारणों से नहीं। उदाहरण के लिए, fgets लिए दूसरा पैरामीटर आदर्श आकार होना चाहिए, लेकिन int


यदि आप अनुभवजन्य प्रकार हैं

echo | gcc -E -xc -include 'stddef.h' - | grep size_t

उबंटू 14.04 64-बिट जीसीसी 4.8 के लिए आउटपुट:

typedef long unsigned int size_t;

ध्यान दें कि stddef.h जीसीसी द्वारा प्रदान किया गया है और जीसीसी 4.2 में src/gcc/ginclude/stddef.h अंतर्गत glibc नहीं है।

दिलचस्प सी 99 उपस्थिति

  • malloc तर्क के रूप में size_t लेता है, इसलिए यह अधिकतम आकार निर्धारित करता है जिसे आवंटित किया जा सकता है।

    और चूंकि इसे sizeof द्वारा भी वापस किया जाता है, मुझे लगता है कि यह किसी भी सरणी के अधिकतम आकार को सीमित करता है।

    यह भी देखें: सी में सरणी का अधिकतम आकार







size-t