Frage zu Funktion mit char* als Parameter



  • Ja das mit dem char* habe ich gemacht, da ich noch nicht weiss, wie lang die Zeichenketten werden. Mit nem char kann ich doch nur ein Zeichen schreiben. Das es mit nem char geht ist mit klar, ich hatte nur bedenken weil ich ja jetzt eine beliebig lange Zeichenkette in der Unterfunktion an den in main zugewiesenen Zeiger hängen kann. Ich bin mir nicht sicher, ob das automatisch gemanaged wird!



  • Soweit ich weiß, geht das da ohne Probleme, weil die Zuweisung eben nicht den Speicherinhalt kopiert (dafür gibt es strcpy() und Kollegen), sondern nur den Zeiger auf ein anderes Ziel umbiegt.

    (im Klartext: die Zeichenketten "Init" und "meine Fehlermeldung" stehen jede irgendwo im Speicher - und durch die Zuweisung "*zeiger="meine Fehlermeldung";" wird nur der Pointer auf einen anderen Speicherbereich verschoben)



  • Hi,

    was mich ein wenig wundert, ist, dass der Compiler dort keine "const-Verletzung" anmeckert. Immerhin dürfte man zwar den Zeiger woanders hin zeigen lassen, aber IIRC sollte man "seinen Speicher nicht beschreiben".

    Also hätte ich erwartet, dass der Compiler dort auch ein "char const *" besteht.

    Natürlich geht das, aber ich halte es für ziemlich riskant, wenn man nicht konsequent die Schreibzugriffe verhindert - und man kann das relativ leicht vergessen.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    was mich ein wenig wundert, ist, dass der Compiler dort keine "const-Verletzung" anmeckert. Immerhin dürfte man zwar den Zeiger woanders hin zeigen lassen, aber IIRC sollte man "seinen Speicher nicht beschreiben".

    Wer überschreibt denn hier den Speicher? Die Zuweisung dort oben biegt nur den Zeiger um.

    (und es ist afaik ein Relikt aus C-Zeiten, daß String-Literale anstandslos an "normale" char*'s übergeben werden dürfen - du riskierst jedoch Zugriffsfehler, wenn du sie dann ändern willst)



  • CStoll schrieb:

    du riskierst jedoch Zugriffsfehler, wenn du sie dann ändern willst

    dazu kann man ja 'const' benutzen. ich persönlich halte zwar nix von 'const' aber in dem fall...

    const char *p = "hallo"; // pointer und init
     p = "doof";              // pointer umbiegen geht
     p[0] = 'm';              // geht nicht (wegen const)
    


  • net schrieb:

    CStoll schrieb:

    du riskierst jedoch Zugriffsfehler, wenn du sie dann ändern willst

    dazu kann man ja 'const' benutzen.

    Ja, man kann - aber leider muß man nicht (sprich: ohne das const käme dein Code problemlos durch den Compiler (wenn er will, gibt er eine Warnung aus), würde allerdings bei Ausführung abstürzen).



  • Danke für die Hilfe. Ich nehme als Fazit mit, dass es geht, aber nicht ungefährlich ist, wie ich es mir schon dachte. Werde den Code mal mit const testen.



  • CStoll schrieb:

    ...Wer überschreibt denn hier den Speicher? Die Zuweisung dort oben biegt nur den Zeiger um.

    Das war mir bewußt und habe ich auch nicht behauptet. Es geht mir eigentlich um Folgendes:

    CStoll schrieb:

    ...(und es ist afaik ein Relikt aus C-Zeiten, daß String-Literale anstandslos an "normale" char*'s übergeben werden dürfen...

    Mich wundert es eben, dass man einen non-const-Pointer auf ein Literal weisen lassen kann.

    Nun gut, ist wohl "historisch gewachsen" (und bei C++ nicht verbessert).

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Nun gut, ist wohl "historisch gewachsen" (und bei C++ nicht verbessert).

    Genau das ist es - im C Standard galten String-Literale nicht als "const" und da C++ noch kompatibel zu C sein wollte, wurde das auch mit übernommen.

    (und außerdem besagt ein fehlendes const nicht, daß man seinen Wert ändern MUSS ;))



  • CStoll schrieb:

    ...außerdem besagt ein fehlendes const nicht, daß man seinen Wert ändern MUSS 😉

    Stimmt natürlich auch ..... so wie ein "public" auch nicht bedeutet, dass man darauf zugreifen muß. 😉
    Nichtsdestotrotz finde ich solche "Programmierhilfen" ganz schön ....

    Gruß,

    Simon2.


Anmelden zum Antworten