मैंने पाया कि कुछ लोग और पुस्तकें जैसे संदर्भ बताते हैं कि p != NULL
और p
पिछले आवंटन से उत्पत्ति (उदा। malloc
), तो realloc(p, 0)
जीएनयू/लिनक्स पर free(p)
के बराबर है। वास्तव में है कि ढंग (जोर मेरा भविष्य में) में इस शोध man realloc
राज्यों का समर्थन करने के लिए:क्या realloc (पी, 0) वास्तव में glibc में मुफ्त (पी) शामिल है?
realloc() फ़ंक्शन आकार बाइट्स ptr द्वारा की ओर इशारा किया स्मृति ब्लॉक का आकार बदल जाता है। सामग्रियों को से लेकर पुराने और नए आकारों तक की क्षेत्र की शुरुआत में अपरिवर्तित किया जाएगा। यदि नया आकार पुराने आकार से बड़ा है, तो जोड़ा गया स्मृति प्रारंभ नहीं होगा। यदि पीआरटी न्यूल है, तो कॉल आकार के सभी मूल्यों के लिए मॉलोक (आकार) के बराबर है; यदि आकार शून्य के बराबर है, और पीआरटी पूर्ण नहीं है, तो कॉल मुफ्त (पीआरटी) के बराबर है। जब तक पीआरटी न्यूल है, तो इसे पहले कॉल द्वारा malloc(), कॉलोक() या realloc() पर वापस कर दिया जाना चाहिए। यदि क्षेत्र को स्थानांतरित किया गया था, तो एक मुक्त (पीआरटी) किया जाता है।
आप this question में मिल सकता है के रूप में, सी स्टैंडर्ड ठीक परिभाषित नहीं करता है कि क्या होने चाहिए और वास्तविक व्यवहार कार्यान्वयन परिभाषित किया गया है। अधिक विशेष रूप से:
C11 §7.22.3/p1 मेमोरी प्रबंधन कार्यों का कहना है: या तो एक अशक्त:
अनुरोध किया अंतरिक्ष के आकार शून्य है, व्यवहार कार्यान्वयन परिभाषित किया गया है सूचक वापस, या व्यवहार ऐसा लगता है जैसे आकार कुछ nonzero मान थे, सिवाय इसके कि लौटाया गया पॉइंटर किसी ऑब्जेक्ट तक पहुंचने के लिए उपयोग नहीं किया जाएगा।
और सी 11 §7.22.3.5 realloc समारोह शामिल हैं:
3) (...) नई वस्तु के लिए स्मृति आवंटित नहीं किया जा सकता है, पुराने वस्तु है और मूल्य को अपरिवर्तित नहीं किया गया।
4)
realloc
समारोह नई वस्तु (जो वर्ष वस्तु के सूचक के रूप में एक ही मूल्य हो सकता है), या एक अशक्त सूचक अगर नई वस्तु आवंटित नहीं किया जा सका के लिए सूचक देता है।
मैं स्मृति चेकर mcheck
की मदद से वास्तविक व्यवहार पता लगाने के लिए कुछ बुनियादी कोड लिखा है, कि glibc
साथ आपूर्ति की है:
#include <mcheck.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a = 5;
int *p, *q;
mtrace();
p = malloc(sizeof(int));
q = &a;
printf("%p\n", (void *) p);
printf("%p\n", (void *) q);
q = realloc(p, 0);
printf("%p\n", (void *) p);
printf("%p\n", (void *) q);
return 0;
}
और परिणाम हैं:
$ gcc -g check.c
$ export MALLOC_TRACE=report
$ ./a.out
0xfd3460
0x7ffffbc955cc
0xfd3460
(nil)
[[email protected] workspace]$ mtrace a.out report
Memory not freed:
-----------------
Address Size Caller
0x0000000000fd3460 0x4 at /home/grzegorz/workspace/check.c:12
आप के रूप में q
देख सकते हैं NULL
पर सेट किया गया था। ऐसा लगता है कि free()
वास्तव में नहीं बुलाया गया था। वास्तव में यह नहीं किया जा सकता जब तक कि मेरी व्याख्या गलत है: के बाद से realloc
NULL
सूचक वापस आ गया है, नई वस्तु आवंटित नहीं किया जा सकता था किया गया, जिसका मतलब है कि:
वर्ष वस्तु पुनः आवंटित की जाती है और नहीं है अपने मूल्य अपरिवर्तित है
क्या यह सही है? या तो एक अशक्त सूचक है:
'रीयलोक (पीआरटी, 0)' के बारे में शब्द 'मुक्त (पीआरटी)' के बराबर है जो पॉज़िक्स में उपयोग किया जाता है, लेकिन [आधिकारिक पॉसिक्स 'realloc' संदर्भ] (http: //pubs.opengroup। संगठन/onlinepubs/9699919799/कार्यों/realloc.html) अब सी मानक से भाषा का उपयोग करता है। हालांकि, पीओएसईक्स मानक कहता है, "अगर' realloc() 'एक शून्य सूचक देता है, तो पी द्वारा इंगित स्थान मुक्त नहीं किया गया है"। –