Hätte nicht gedacht das mein Code so Schrott ist:)
Nein, würde ich so nicht formulieren, bei Dir funktioniert es ja
Ich würde Deinen Code eher
gefährlich nennen
reservierst Du genau ein jämmerliches Byte.
So wird die Speicherreservierung in meinem Buch nunmal beschrieben...
Nunja, vermutlich ein Buch für C-Programmierung auf PCs...
Allerdings wird doch dort auch stehen, wie man die Größe des reservierten Speichers festlegt. Wenn Du z.B. einen 20 Zeichen langen String ablegen möchtest, würde man das so tun:
receive = malloc(sizeof(char)*21)
Man darf nicht vergessen, dass ein String üblicherweise ein Terminierungszeichen '\0' enthält. Daher reserviere ich hier 21 Bytes, um 20 Bytes "Nutzzeichen" abzulegen.
Der Befehl free hebt doch nur die Speicherreservierung wieder auf, ohne ihn zu löschen. Oder habe ich da etwas falsch verstanden???
Das ist zwar richtig, aber es entsteht folgende Situation:
Mit dem Return gibst Du nur einen Zeiger auf diesen Speicherbereich zurück, in dem Deine Nutzdaten liegen und keine Kopie. Jetzt teilst Du dem Compiler durch das free mit, dass der Speicherbereich wieder zur Verfügung steht und mit anderen Daten belegt werden
dürfte. Es ist nun durchaus denkbar, dass - noch bevor Du selber dazu kommst, die Nutzdaten zu verarbeiten - der freigegebene Speicher vom Compiler mit anderen Daten überschrieben wird. Und dann hast Du den Salat.
Wenn Du einen Speicherbereich einmal mit free freigegeben hast, solltest Du ihn auf keinen Fall mehr anpacken bzw. davon ausgehen, dass sich der Inhalt nicht ändert. Das ist saugefährlich, erst recht auf einem PC sollte man das lassen!
Ich möchte nur eine Funktion die mir einen String zurückliefert...
Die ich dann z.B. so ausgeben kann.
printf("%s",funktionxy());
Wie würde dazu eine Profilösung aussehen?
Mein Vorschlag:
char* get_pos(char *str)
{
fputs("POS",MOTOR1);
fgets(str,MOTOR1);
return str;
}
// und dann im Hauptprogramm:
char str[21]; // Speicherbereich für 20 Zeichen + '\0' reservieren
printf("%s",get_pos(str));
Der Funktion get_pos() wird hier einmal ein Zeiger auf ein Array übergeben, in das die Funktion Zeichen ablegen darf. Anschließend gibt die Funktion ebenfalls einen Pointer auf dieses Array zurück, damit Du get_pos bequem aus printf aufrufen kannst.
Gruß
Daniel