2015-08-20 7 views
13

मैंने अपने कार्यक्रम में त्रुटि देखी है और एक साधारण लिखने का फैसला किया है, जो मुझे समझने में मदद करेगा कि क्या हो रहा है। संदेश यह है:munmap_chunk(): अमान्य सूचक

#include <stdio.h> 
#include <stdlib.h> 

char * first() 
{ 
    char * word = malloc(sizeof(char) * 10); 
    word[0] = 'a'; 
    word[1] = 'b'; 
    word[2] = '\0'; 
    return word; 
} 

char * second() 
{ 
    char * word = malloc(sizeof(char) * 10); 
    word = "ab"; 
    return word; 
} 

int main() 
{ 
    char * out = first(); 
    printf("%s", out); 
    free(out); 
    out = second(); 
    printf("%s", out); 
    free(out); 
    return 0; 
} 

first() समारोह ठीक से काम कर रहा है, लेकिन second() (वास्तव में free(out)) genarates त्रुटि:

Error in `./a.out': munmap_chunk(): invalid pointer: 0x0000000000400714 *** ababAborted (core dumped)

मुझे समझ नहीं आता क्यों पहले समारोह सही है, लेकिन दूसरा नहीं है। क्या कोई बता सकता है क्यों?

+2

आप सीधे एक सरणी में एक स्ट्रिंग असाइन नहीं कर सकते हैं, 'strcpy (word, "ab")' का उपयोग करें। – gengisdave

उत्तर

20

समारोह second() में, काम word = "ab";word के लिए एक नया सूचक प्रदान करती है, सूचक malloc() के माध्यम से प्राप्त अधिलेखित। जब आप पॉइंटर पर बाद में free() पर कॉल करते हैं, तो प्रोग्राम क्रैश हो जाता है क्योंकि आप free() पर पॉइंटर पास करते हैं जिसे malloc() के माध्यम से प्राप्त नहीं किया गया है।

स्ट्रिंग अक्षर को असाइन करने से उनके सामग्री की प्रतिलिपि बनाने का असर नहीं पड़ता है जैसा आपने सोचा होगा। एक स्ट्रिंग शाब्दिक की सामग्री की नकल करने के लिए, का उपयोग strcpy():

strcpy(word, "ab"); 
7

funxtion char * second में -

char * word = malloc(sizeof(char) * 10); 
word = "ab"; 

दूसरा बयान word = "ab"; बदलता है word आवंटित memory.You से दूर बात करने के लिए स्ट्रिंग नकल नहीं कर रहे "ab"malloc द्वारा आवंटित ढेर के क्षेत्र में।

और freemalloc द्वारा आवंटित स्मृति या इसी तरह के फ़ंक्शंस आपके प्रोग्राम को क्रैश नहीं करते हैं।

Attempting to free an invalid pointer (a pointer to a memory block that was not allocated by calloc, malloc, or realloc) may affect subsequent allocation requests and cause errors.

आप यहाँ का उपयोग करना चाहिए strcpy के रूप में भी दूसरों के द्वारा सुझाव दिया।

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