Realloc का उपयोग C में कैसे करें [डुप्लिकेट]
मैं realloc फ़ंक्शन का उपयोग करके मेमोरी को पुनः प्राप्त करने की कोशिश कर रहा हूं, मैंने देखा कि आपको पहले मॉलॉक का उपयोग करने की आवश्यकता है लेकिन मुझे समझ नहीं आता कि क्या आप इसे उपयोग करना चाहते हैं क्योंकि चलो कहते हैं कि मैं निम्नलिखित स्ट्रिंग बना रहा हूं:
char string[] = "fun";
अगर मैं और अधिक स्थान जोड़ने की कोशिश करूँगा तो रियलकॉक फ़ंक्शन काम करेगा?
जो मुझे मेरे सवाल पर लाता है, मैं स्ट्रिंग के अंत में बस एक अक्षर जोड़ने की कोशिश कर रहा हूं, 'p' कहने देता हूं, लेकिन किसी कारण से यह प्रोग्राम हर बार जब मैं इसे चलाता हूं तो रियललोक लाइन पर क्रश हो जाता है।
यहाँ मेरा पूरा कोड है:
int main()
{
char string[] = "fun" ;
str_func(string);
printf("%s", string);
return 0;
}
void str_func(char* str)
{
str = (char*)realloc(str, strlen(str) + 2);
strcat(str, "p");
}
मैंने 'स्ट्रिंग' को पॉइंटर बनाने और पॉइंटर भेजने की कोशिश भी की, जिसके परिणामस्वरूप वही हुआ।
जवाब
अगर मैं और अधिक स्थान जोड़ने की कोशिश करूँगा तो रियलकॉक फ़ंक्शन काम करेगा?
नहीं, क्योंकि वह सरणी ढेर पर आवंटित नहीं है - आपके मामले में यह ढेर पर आवंटित होने की संभावना है और इसे आकार नहीं मिल सकता है। सीधे शब्दों में कहें: realloc
सूचक को नहीं पहचानता है और यह नहीं जानता कि इसके साथ क्या करना है, लेकिन वैसे भी कुछ करने की कोशिश करता है, इसलिए दुर्घटना।
आप केवल realloc
उस पॉइंटर पर कॉल कर सकते हैं जो पहले पारित किया गया था malloc
, या एक शून्य पॉइंटर पर। बस यही काम करता है।
विवरण के लिए, देखें कि ढेर और ढेर पर क्या आवंटित होता है? ।
मैंने देखा कि आपको पहले मॉलॉक का उपयोग करने की आवश्यकता है लेकिन मुझे समझ में नहीं आता है कि क्या आप इसे उपयोग करना चाहते हैं
यदि आपको कुछ करने से पहले उपयोग करने की आवश्यकता है, तो परिभाषा के अनुसार आपको केवल उन चीजों को मूल रूप से आवंटित किया जाना चाहिए जिनके साथ आवंटित किया गया है ।malloc
realloc
realloc
malloc
आप "आवश्यकता" और "होना चाहिए" के बीच कुछ स्थान खोजने की कोशिश कर रहे हैं जो मौजूद नहीं है।
... किसी कारण से प्रोग्राम रियललोक पर क्रश हो जाता है
आपने पहले ही कहा था कि आप जानते हैं कि आपको उपयोग करने की आवश्यकता है malloc
। तब आपने उपयोग नहीं किया malloc
, और आप पूछ रहे हैं कि यह एक समस्या क्यों है। आप कम से कम उस चीज़ को करने की कोशिश कर सकते हैं जिसे आप "जानते हैं" आपको करने की ज़रूरत है, यह देखने के लिए कि क्या समस्या हल होती है।
कार्यक्रम को शायद देखना चाहिए
int main()
{
/* array is an automatic local variable. It wasn't dynamically allocated
in the first place, so can't be dynamically re-allocated either.
You cannot (and don't need to) free it either, it just goes out of scope
like any other automatic variable.
*/
char array[] = "fun";
/* you need to use malloc (or one of the other dynamic allocation functions)
before you can realloc, as you said yourself */
char *dynamic = malloc(1+strlen(array));
memcpy(dynamic, array, 1+strlen(array));
/* realloc can move your data, so you must use the returned address */
dynamic = str_func(dynamic);
printf("old:'%s', new:'%s'\n", array, dynamic);
/* not really essential since the program is about to exit anyway */
free(dynamic);
}
char* str_func(char* str)
{
char* newstr = realloc(str, strlen(str) + 2);
if (newstr) {
strcat(newstr, "p");
return newstr;
} else {
/* we failed to make str larger, but it is still there and should be freed */
return str;
}
}
आपकी मूल स्थिति बिल्कुल सही नहीं है: वास्तव में सूचक को पारित कर दिया गया था realloc
... पहले से आबंटित किया जाना चाहिए
malloc()
,calloc()
याrealloc()
अभी तक मुक्त या वास्तविक के लिए कॉल के साथ मुक्त नहीं किया जाना चाहिए
[या] यदि ptr पूर्ण है, तो व्यवहार कॉलिंग के समान है
malloc(new_size)
।
realloc
समारोह केवल बातें (जैसे कि मूल रूप से आवंटन कार्यों के एक छोटे समूह के साथ बनाया गया था के साथ काम करता malloc
, calloc
या realloc
खुद को), या नल पॉइंटर। चूंकि string
उन चीजों में से कोई भी नहीं है, इसलिए आपका कोड अच्छी तरह से परिभाषित नहीं है।