C++ Hänger

Code:
void read_command(char* command) {
    command = new char[5];
    command[0] = 'f';
}


int main(int argc, char *argv[]) {
    char* command;
    test(command);
    cout << command;
}

Müsste dieses C/C++ Programm nicht das f ausgeben?
Ich versteh es grad nicht...
 
Vermutlich willst du nicht die Funktion "test" aufrufen, sondern "read_command"...

Oder was sagt die Fehlermeldung beim Kompilieren?
 
sry vergessen um zu schreiben... ist nur ein Schnipsel aus einem größeren Programm...

//edit: keine Compiler Fehler, es kommt einfach keine Ausgabe

edit2:
so würde es funktionieren:

Code:
void test(char* command) {
    delete command;
    command = new char[5];
    command[0] = 'f';
}


int main(int argc, char *argv[]) {
    char* command = new char;
    test(command);
    cout << command;
}

aber warum nur so?
 
Zuletzt bearbeitet:
Ich war noch nie der große Freund von C++, aber auf die Schnelle sehe ich gerade in der zweiten Version dangling Pointer und (afaik) uninitialisierte Werte ;)

Zudem:
test(char* command) = variable von Typ char-pointer als Parameter
Das wäre ok, wenn Du hier den Inhalt des Speichers, auf den 'command' zeigt, ändern wollen würdest.
test(command); => test wird mit dem Wert von 'command' aufgerufen.
Du kannst allerdings 'command' innerhalb von "test" so viel ändern wie Du magst, die "command" Variable in 'main' wird nicht geändert. Das ist der Sinn der lokalen Variablen und Parameterübergabe ;)

Du möchtest in der Funktion aber den Wert von 'command' aus 'main' ändern:
d.h Du musst mit der Referenz von 'command' arbeiten:
Code:
void test(char* &myptr) {  /* wir wollen eine Referenz auf einen char-ptr*/
    myptr = new char[5](); /* sollte ab c++ 03 für eine zero-initialisierung sorgen*/
    myptr[0] = 'f';
}
...
char * command;
test(command);
PS:
so würde es funktionieren
Das funktioniert nur, weil zuerst der Speicherblock freigegeben wird und direkt danach ein neuer angefordert - und da wird der gerade freigegebene Speicherblock wieder zugewiesen.
Code:
    delete command;
    command2 = new char[5];
    command = new char[5];
    command[0] = 'x'; - und schon sollte es nicht mehr "funktionieren" ;)
    delete command2;
Rein sprachtechnisch gesehen, zeigt 'command' in der 'main' nach dem Aufruf von 'test' eigentlich auf (mittels delete) freigegebenen Speicher und ist damit ungültig.
Dass es in der Praxis trotzdem klappt, hängt nur mit der Heap-Implementierung der jeweiligen C++ Runtime zusammen ;)
 
Zurück
Oben