[gelöst] Problem mit free(), dynamische Speicherverwaltung
-
Hi! Also folgendes ich hab da ein Programm das eigentlich funktioniert, und zwar bis zu den free() befehlen am Ende.
Ich krieg dann folgende Fehlermeldung, im Terminal:
free(): invalidPointer: "Adresse von dest" ***Also so halbwegs habe ich das ja auch schon entschlüsselt, der Fehler liegt also in der Zuweisung
dest = "hallo"
-> aber warum sollte deswegen das free() nicht mehr funktionieren? der reservierte Speicher bleibt ja trotzdem an den gleichen Adressen oder nicht? Desweiteren wundert mich wieso es mit scanf(..) geht (denn da wird der Speicher ja auch bearbeitet, und die Variable source lässt sich sehr wohl deallokieren)
Arbeite übrigens mit Linux und Code:Blocks, falls das irgendetwas zur Sache tun könnte. Danke für eure Hilfe!
Hier nochmal der ganze Code:
#include <stdio.h> #include <stdlib.h> const int maxStringSize = 255; int main() { printf("Please Input Source String!\n"); char * source = malloc(sizeof(char)*maxStringSize); scanf("%s",source); printf("You input: %s",source); printf("Now copying... \n \n"); // insert copy method here char * dest = malloc(sizeof(char)*maxStringSize); dest = "hallo"; free(source); free(dest); return 0; }
-
KnufflPuffl schrieb:
dest = "hallo"; ... free(dest);
das dest = "hallo" überschreibt den pointer, das findet 'free' nicht lustig.
-
danke erstmals!
naja es ist schon klar dass es den Pointer überschreibt.. aber ich muss den String doch noch ändern können!?, falls nicht über direkte Zuweisung, gibt es andere(bessere) Möglichkeiten?
lg
-
scanf("%s",source);
scanf ist was ganz madiges wer sagt dir das der user nicht mehr eingibt als deine 254 zeichen die du zur verfügung stellst? keiner also limitiere bitte die eingage und zwar so
scanf("%254s",source);
254 weil wir ja jeden string mit '\0' abschließen, hoffe ich hab mich jetzt nicht verzählt aber das prinzip wird klar
lg lolo
-
na, vom prinzip so:
strcpy (dest, "hallo", strlen("hallo")+1);
^^musste die bytes rüberkopieren und nicht den pointern verändern.
-
also erstens danke für die scanf Anweisung, hab ich vergessen stimmt ^^
und hab schon ne lösung gefunden, nämlich mit strcpy(...).
Aber soweit ich mich erinnere funktionieren normalerweise Zuweisungen von char * doch auch oder nicht?
-
was fricky meinte war "strncpy()" statt "strcpy()"
KnufflPuffl schrieb:
danke erstmals!
naja es ist schon klar dass es den Pointer überschreibt.. aber ich muss den String doch noch ändern können!?, falls nicht über direkte Zuweisung, gibt es andere(bessere) Möglichkeiten?
lg
besser die rückgabe von malloc speichern
char * dest = malloc(sizeof(char)*maxStringSize); char *ddest = dest; dest = "hallo"; free(ddest);
anders falls du das nicht willst
char * dest = malloc(sizeof(char)*maxStringSize); strcpy(dest,"hallo"); free(dest);
btw. was machst du eigentlich wenn dir mal der speicher ausgeht und das malloc mit nem NULL daher kommt
dann weiß dein proggie nicht was es machen soll... also
char *mm = malloc(mysize); if(mm == NULL){ printf("out of memory"); return 1; }
lg lolo
-
KnufflPuffl schrieb:
Aber soweit ich mich erinnere funktionieren normalerweise Zuweisungen von char * doch auch oder nicht?
naja, aber damit schubst du pointer durch die gegend, nicht die daten, auf die sie zeigen.
-
ok danke für die tollen Antworten, funktioniert alles super!
danke auch für die zusätzlichen Hinweise u. Vorschläge!