Memory Problem

dadevelopa

Mitglied
Hallo zusammen, ich habe mal wieder ein kleines C Memory Problem.

In folgender Funktion wird beim freigeben des Stringpointer jeweils der Fehler DAMAGE:after normal block geworfen.
Ich verstehe jedoch nicht warum, ein String wird doch normalerweise so freigegeben...
Code:
struct datensatz* parseUserString(char *str, int size){
    char *tmp = (char *) calloc(size, sizeof(char));
    char *ihu;
    struct datensatz *list;
    int actualId = 0;

    list = (struct datensatz*)malloc(sizeof(struct datensatz));
    list->next = NULL;
    
    strcpy (tmp, str);
	
    while (strlen (tmp) > 1) {
		
    	ihu = strrchr (tmp, '@');
    	*ihu = '\0';

        ihu = strrchr (tmp, '/');
        if (ihu == NULL) {
            break;
        }
	
       strcpy (list->telP, (ihu + 1));
        *(ihu) = '\0';
		
	ihu = strrchr (tmp, '/');
        strcpy (list->telN, (ihu + 1));
        *(ihu) = '\0';

	ihu = strrchr (tmp, '/');
        strcpy (list->telG, (ihu + 1));
        *(ihu) = '\0';

	ihu = strrchr (tmp, '/');
        strcpy (list->idle, (ihu + 1));
        *(ihu) = '\0';

        ihu = strrchr (tmp, '/');
        strcpy (list->host, (ihu + 1));
        *(ihu) = '\0';
        
        ihu = strrchr (tmp, '/');
        strcpy (list->user, (ihu + 1));
        *(ihu) = '\0';
		
	list->id = actualId;

	list->prev = (struct datensatz*)malloc(sizeof(struct datensatz));
        list->prev->next = list;
        list = list->prev;

	actualId++;
    }
    list = list->next;
    free(list->prev);
    list->prev = NULL;
    free(tmp); //hier wird der Fehler geworfen
    return list;
}

Koennt ihr mir sagen, warum das so ist, und wie ich den Fehler beheben kann?
 
Zuletzt bearbeitet:
Hi.

Du solltest size+1 Bytes Speicher für tmp reservieren - du hast die abschließende \0 vergessen. Der Fehler rührt daher, weil du über das Ende des allozierten Speichers hinaus geschrieben hast als du den String nach tmp kopiert hast.

Gruß
 
Zurück