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ß
 

Neue Beiträge

Zurück