Zenerid hat geschrieben:Es ist mir wieder ein wenig unangenehm ...
push ...
Schließe mich cloidnerux an: Du stellst keine idiotischen Fragen, mir ist Deine Rückfrage nur durchgerutscht. War keine Absicht.
Zenerid hat geschrieben:@Xin
Das mit dem wann man wann Speicher allozieren muss und wann nicht habe ich jetzt verstanden, denke ich. Bei strchr hat man ja dann auch echt nur den Zeiger auf die Stelle und wenn man wirklich etwas speichern will, also neuen Inhalt oder wie bei strdup Funktion dann alloziert man sich halt Speicher.
Yepp.
Mit der letzten Frage meinte ich eigentlich das, was ich vorher auch schon gemeint habe. Ich habe diesen Pointer ptr wie oben im Code-Beispiel gezeigt auch so an die Funktion übergeben und dann einfach in der Funktion myFunction2 sowas wie
gemacht. Wenn ich dann aber myFunction3(ptr) aufgerufen habe, dann war der Pointer ebend wieder am Anfang, statt wie z.B bei "Hallo Welt" mit ptr += 5 auf "Welt", ebend auf "Hallo". So wollte ich das ebend haben.

Das war meine Frage.[/quote]
Vielleicht mal ganz grundsätzlich als allgemeines Verständnisproblem: Ein Identifier (z.B. der Name einer Variable) gilt immer im lokalen Namensraum, zum Beispiel innerhalb einer Funktion. Ein Identifier spricht immer eine Speicherstelle an. Ein "ptr" in Funktion 1 ist dabei aber eben nicht das gleiche wie "ptr" in Funktion 2. "ptr" in Funktion 2 ist beispielsweise Parameter1, dann beedutet "ptr", dass Du die Speicherstelle für Parameter1 meinst. In Funktion1 hingegen ist es eine lokale Variable, dann meint "ptr" dort, dass Du die lokale Variable meinst.
cloidnerux beschreibt das mit einem Pointer-auf-Pointer (char **). Hier steht in der Speicherstelle des Parameters (Typ char **) der Zeiger auf eine Speicherstelle mit Typ (char*), die Du in einer anderen Funktion ebenfalls mit "ptr" ansprichst. Weil die Datentypen unterschiedlich sind, zeigt sich hier aber auch klarer, dass "ptr" in beiden Fällen unterschiedliche Variablen sein müssen.
Zenerid hat geschrieben:
Auch noch einmal eine Frage anhand eines Beispiels. Wenn ich diese Funktion hier habe:
Code: Alles auswählen
void chrrep(char* str, char chr, char repChar) {
for (; *str; str++) {
if (*str == chr)
*str = repChar;
}
}
Dann sage ich ja ststr++ aber ist das nicht auch eigentlich gefährlich oder achtet c da auch auf die Grenze? Kann ich mich so durch den gefahrlos durch den Inhalt eines Pointers bewegen (vorausgesetzt der Pointer ist != NULL, was ja in der Funktion nicht überprüft wird)?
Die Funktion geht in der For-Schleife davon aus, dass str mit einem Nullbyte endet (siehe zweiter Parameter von for).
C achtet aus Prinzip niemals auf Grenzen, außer Du programmierst das - und das ist hier geschehen mit dem 2. Parameter von for.
Zenerid hat geschrieben:Ich habe die Funktion auch mal getestet und es funktioniert auch anscheinend aber weiß c dann in dem Fall, wann str++ nicht mehr geht, also wo die Speicheradrese zuende ist oder wie kann man das sagen?
Da wird der str bzw. der Inalt des Pointers? ja auch verändert und ebend der Inhalt an der Stelle *str mit dem char ersetzt, den man der Funktion übergibt, obwohl man da den Pointer ja nicht mit & übergibt.
Der Pointer wird str kommt als Kopie in die Funktion. Die Kopie wird verändert. Das Original (also die Variable, die Du beim Aufruf von chrrep "übergibst" (korrekteres Wort "kopierst"!), bleibt unverändert.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.