2015-08-20 18 views
13

Ho individuato l'errore nel mio programma e ho deciso di scriverne uno semplice, che mi aiuterebbe a capire cosa sta succedendo. Eccolo:munmap_chunk(): puntatore non valido

#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; 
} 

La funzione first() funziona correttamente, ma il second() (esattamente la free(out)) Errore genarates:

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

non capisco il motivo per cui la prima funzione è corretta, ma la il secondo no. Qualcuno potrebbe spiegare perché?

+2

Non è possibile assegnare direttamente una stringa a un array di caratteri, utilizzare 'strcpy (word," ab ")'. – gengisdave

risposta

20

Nella funzione second(), l'assegnazione word = "ab"; assegna un nuovo puntatore word, sovrascrivendo il puntatore ottenuto tramite malloc(). Quando si chiama free() sul puntatore in seguito, il programma si arresta in modo anomalo perché si passa un puntatore a free() che non è stato ottenuto tramite malloc().

L'assegnazione di stringhe letterali non ha l'effetto di copiare il loro contenuto come si sarebbe potuto pensare. Per copiare il contenuto di una stringa letterale, utilizzare strcpy():

strcpy(word, "ab"); 
7

In funxtion char * second -

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

La seconda affermazione word = "ab"; cambia word a punto dal memory.You assegnato non stanno copiando la stringa "ab" all'area di heap allocata da malloc.

E a free una memoria non allocata da malloc o funzioni simili arresta il programma.

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.

Si consiglia di utilizzare qui strcpy come suggerito anche da altri.

Problemi correlati