[C++] char Problem

radazong

Mitglied
Hallo!

Ich habe eine Funktion geschrieben, der eine Zeichenkette übergeben werden soll, die innerhalb der Funktion in ein anderes char-Array kopiert werden soll.
Code:
const char* ChangeChar(char *satz)
{
    char *buffer;

    strcpy(buffer,satz);

    return buffer;
}

Ich weiss, dass die Funktion in der Form etwas sinnlos ist, es geht mir nur erstmal um das Verstehen.
Wenn ich das Programm jetzt ausführe, kommt die berühmte "Problembericht senden" Meldung. Was mache ich falsch? Habe buffer schon mit
Code:
new *char[strlen(satz)];
angelegt, habe die Funktion als nicht-const angelegt, usw usf..
Habe zeitweise auch die Arrays einzeln zugewiesen, allerdings wurden da nie mehr als 8 Zeichen ausgegeben, wenn ich das in der for-Schleife gemacht hab.

Ich hoffe, ich habe alles verständlich beschrieben, und bedanke mich schonmal für evtl. Antworten.
 
Okay, ich weiss- Jetzt wird kriminell. Ich habe jetzt Speicher auf dem Heap mit new char[] für buffer angelegt. Diesen gebe ich nun allerdings beim beenden der Funktion nicht wieder frei. Trotzdem funktioniert alles reibungslos.
Überflute ich damit nun nach und nach den Heap, oder wird der Speicher beim Verlassen der Funktion automatisch wieder freigegeben? Hier der Code:
Code:
char* ChangeChar(char *satz)
{
    char *buffer=new char[];
    int count=0;

    strcpy(buffer,satz);
    strcat(buffer,"x");

    return buffer;
}
 
Hi.
Okay, ich weiss- Jetzt wird kriminell. Ich habe jetzt Speicher auf dem Heap mit new char[] für buffer angelegt. Diesen gebe ich nun allerdings beim beenden der Funktion nicht wieder frei. Trotzdem funktioniert alles reibungslos.
Überflute ich damit nun nach und nach den Heap, oder wird der Speicher beim Verlassen der Funktion automatisch wieder freigegeben?
Nein, freigegeben wird da automatisch überhaupt nichts. Für Speicher den du mit new bzw. new[] angelegt hast bist du als Programmierer selbst verantwortlich und mußt den Speicher auch mit delete bzw. delete[] wieder freigeben. Wenn du das nicht tust, dann hast du ein sog. "Memory Leak" im Programm und der Heapspeicher nicht stetig ab.

Wenn du einen Zeiger aus einer Funktion zurückgibst, ist automatisch der aufrufende Teil des Programmes dafür verantworlich den Code wieder freizugeben:
C++:
char* foo() {
  return new char[50];
}
...
char* buf = foo();
...
delete[] buf;
Das Problem in C++ ist hier, dass der Aufrufer nicht unbedingt wissen kann wie der Speicher alloziert wurde und ob er nun free(), delete oder delete[] verwenden muss.

Deshalb kapselt man gerne solche Speicherverwaltung in Klassen. Für Zeichenketten gibt's die std::string Klasse, die einem da jede Menge Arbeit abnimmt.

C++:
char* ChangeChar(char *satz)
{
    char *buffer=new char[];
So ganz richtig ist das auch nicht. Du mußt schon eine Größe für das Array angeben, sonst wird nur Speicher für einen Zeiger alloziert.
C++:
char* buffer = new char[strlen(satz) + 2];
Gruß
 
Hallo!
Vielen Dank erstmal für die Antwort...hatte meine Funktion auch schon angepasst, hab das hier bloß nicht aktualisiert.

Code:
char* ChangeChar(char *satz,int iLen)
{
    char *buffer=new char[iLen+1];
    int count=0;

    for(;count<iLen;count++)
    {
       buffer[count]=satz[count];
    }
    
       buffer[iLen]='\0';

    return buffer;
}

Und so wie ich das jetzt von dir verstanden habe, kann ich im Programm einen Zeiger anlegen, ihm diese Funktion zuweisen, und muss dann nur den Zeiger aus dem Programm wieder mit delete[] freigeben?

Code:
char * Satz={"Hallo"};
char* Buf=ChangeChar(Satz,strlen(Satz));

//..... bliblablubb

delete[] Buf;

//....

Un noch eine Frage - Ich habe mich bisher nicht sooo ausführlich mit Pointern beschäftigt, und die Funktion free() ist mir dabei noch garnicht untergekommen. Wann wie wo was setzt man diese Funktion denn ein?

MfG
 
Hi.
Und so wie ich das jetzt von dir verstanden habe, kann ich im Programm einen Zeiger anlegen, ihm diese Funktion zuweisen, und muss dann nur den Zeiger aus dem Programm wieder mit delete[] freigeben?
Ja. :)
Un noch eine Frage - Ich habe mich bisher nicht sooo ausführlich mit Pointern beschäftigt, und die Funktion free() ist mir dabei noch garnicht untergekommen. Wann wie wo was setzt man diese Funktion denn ein?
Die Funktion free() stammt von C. Wenn du mit C++ arbeitest wirst die die Funktion kaum brauchen - außer natürlich du benutzt C Bibliotheken die Speicher mit den Funktionen malloc bzw. calloc allozieren.

Gruß
 
Okay, vielen Dank. Das Problem konnte Dank deiner Antwort aus der Welt geschafft werden, und etwas schlauer bin ich auch noch geworden.
Tschüß
 
Zurück