2012-03-20 6 views
37

मुझे आश्चर्य है, क्यों इस तरह के समारोह के रूप में:
-memset
-memmov
-memchr
-memcpy
स्मृति कार्य जैसे मेमसेट, memchr ... string.h में हैं, लेकिन stdlib.h में किसी अन्य mem फ़ंक्शन के साथ नहीं हैं?

string.h हेडर फाइल में मौजूद हैं, लेकिन stdlib.h फ़ाइल में नहीं, देखते हैं जहां अन्य मानक स्मृति कार्यों गतिशील स्मृति आवंटन के रूप में: malloc, कॉलोक, realloc, मुफ्त।

शायद उन्हें एक शीर्षलेख में एकजुट करना बेहतर होगा? आपने इस बारे में क्या सोचा? मुझे समझ में नहीं आता है, स्मृति कार्यों का एक सेट दूसरों से अलग क्यों होता है और स्ट्रिंग हेडर (string.h) में मौजूद होता है।

+1

यह आपके द्वारा उपयोग की जा रही सी लाइब्रेरी के साथ कार्यान्वयन समस्या की तरह दिखता है। अन्य सी लाइब्रेरी memcpy को stdlib में ले जाने का विकल्प चुन सकती है। – AgA

+1

'malloc' और गतिशील स्मृति आवंटन के साथ पारिवारिक सौदा। बाइट्स के अनुक्रमों के साथ 'memcpy' और परिवार सौदा। 'strcpy' और परिवार थोड़ा अलग तरीके से बाइट्स के अनुक्रमों से भी निपटते हैं। –

+5

@AgA: यदि कोई सी लाइब्रेरी आईएसओ मानक के अनुरूप है तो 'memcpy'' string.h' में होगा, 'stdlib.h' नहीं। – Blastfurnace

उत्तर

30

क्योंकि वास्तव में string.h को एक मानक शीर्षलेख के रूप में परिभाषित किया गया है जो कार्यों की घोषणा करता है जो वर्णों की सरणी का इलाज करते हैं और न केवल स्ट्रिंग्स। memcpy और memset जैसे फ़ंक्शंस उन तर्कों को लेते हैं जिन्हें वर्णों के प्रकार सरणी के किसी ऑब्जेक्ट के पहले तत्व पर पॉइंटर्स के रूप में माना जाता है।

(C99, 7.21.1p1) शीर्षक < string.h> एक प्रकार और कई कार्य वाणी है, और एक मैक्रो सरणियों चरित्र प्रकार के के रूप में इलाज चरित्र प्रकार और अन्य वस्तुओं की सरणियों जोड़ तोड़ के लिए उपयोगी परिभाषित करता है।

+2

लेकिन यादृच्छिक, memchr, memmov, memcpy काम के साथ विधियों * प्रकार और वास्तव में और अधिक काम स्मृति नहीं है, क्या मैं सही हूँ? –

+2

आप किसी ऑब्जेक्ट पॉइंटर प्रकार को पास कर सकते हैं, लेकिन सरणी तत्वों को वास्तव में व्याख्या किया गया है जैसे कि उनके पास 'हस्ताक्षरित char' प्रकार है। (सी 99, 7.21.1p3) – ouah

+1

'शून्य *' के संबंध में, ध्यान दें कि के एंड आर सी (प्री-स्टैंडर्ड सी) में, कोई 'शून्य' प्रकार नहीं था और 'memcpy' और' memset' जैसे कार्यों के पैरामीटर ' char * 'प्रकार और' void * 'नहीं। – ouah

10

मैं वास्तव में string.h कार्यों को "स्मृति" कार्यों के रूप में नहीं सोचूंगा। इसके बजाय, मैं उनके बारे में "सरणी" कार्यों के रूप में सोचूंगा, क्योंकि वे स्मृति के अनुक्रमों में मौजूद डेटा पर काम करते हैं। इसके विपरीत, malloc (और अन्य), वास्तव में स्मृति के क्षेत्र में डेटा के हेरफेर के बजाय आवंटन जैसी स्मृति सेवाएं प्रदान करते हैं।

विशेष रूप से, string.h में फ़ंक्शंस मेमोरी के किसी भी आवंटन या हटाने या स्मृति प्रबंधन के किसी भी प्रकार की देखभाल नहीं करते हैं। यहां तक ​​कि char * strerror(int) जैसे फ़ंक्शन, जो एक पूरी नई स्ट्रिंग बनाने के लिए प्रतीत होता है, कोई आवंटन नहीं करता है, क्योंकि रिटर्न मान वास्तव में एक स्थिर-आवंटित स्ट्रिंग है। अन्य फ़ंक्शन एक पॉइंटर को मेमोरी ब्लॉक में वापस कर सकते हैं, लेकिन यह वास्तव में उनके पैरामीटर में से एक है (उदा। memcpy)। या वे एक उप-स्ट्रिंग (strtok) की शुरुआत में एक सूचक लौटाते हैं, या एक तुलना का प्रतिनिधित्व करने वाला एक पूर्णांक (memcmp)।

दूसरी ओर, stdlib.h भी वास्तव में स्मृति के बारे में नहीं है। stdlib.h का डिज़ाइन सामान्य उद्देश्य के संचालन प्रदान करना है जो बड़ी संख्या में कार्यक्रम की आवश्यकता होगी। मेमोरी फ़ंक्शन केवल ऐसे मौलिक परिचालनों के उदाहरण होते हैं। हालांकि, exit और system जैसे अन्य फ़ंक्शन भी अच्छे उदाहरण हैं, फिर भी स्मृति पर लागू न हों।

अब stdlib.h में कुछ कार्य करता है जो IMO सकता string.h में रखा गया है, विशेष रूप से विभिन्न रूपांतरण कार्यों (mbstowcs, wcstombs, atoi, strtod, आदि), और शायद bsearch और qsort कार्य हैं। ये फ़ंक्शन string.h फ़ंक्शंस के समान सिद्धांतों का पालन करते हैं (वे सरणी पर काम करते हैं, नए आवंटित मेमोरी ब्लॉक वापस नहीं करते हैं)।

लेकिन एक व्यावहारिक दृष्टिकोण से, भले ही वह malloc, realloc, calloc और free कार्यों के साथ mem* कार्यों गठबंधन करने के लिए भावना का एक बहुत बनाया, सी मानक पुस्तकालय कभी नहीं इस तरह पुनर्गठित किया जा रहा है। इस तरह के एक बदलाव निश्चित रूप से कोड तोड़ देगा। इसके अलावा, stdlib.h और string.h इतने लंबे समय से आसपास रहे हैं, और दोनों उपयोगी और मौलिक पुस्तकालय हैं, कि परिवर्तन शायद सबसे अधिक (या कम से कम, बहुत सी) कोड को तोड़ देंगे।

3

प्री-स्टैंडर्ड सी में, इन कार्यों को वास्तव में कहीं और परिभाषित किया गया था, लेकिन न तो stdlib.h और न ही अन्य मानक शीर्षकों में, लेकिन memory.h में। यह अभी भी आपके सिस्टम पर मौजूद हो सकता है, यह निश्चित रूप से अभी भी ओएस एक्स (आज के रूप में) पर करता है।

ओएस एक्स 10.11 (लाइसेंस हेडर के बिना) पर memory.h:

#include <string.h> 

पूरी फ़ाइल string.h ing, पीछे की ओर पूर्व स्टैंडर्ड सी कार्यक्रमों के साथ संगतता बनाए रखने के लिए केवल #include है '।

संबंधित मुद्दे

 संबंधित मुद्दे