Wenn Sie den Wert des Zeigers festlegen möchten, und geben sie zurück, dann muss b()
einen Zeiger zurück:
int a(void) {
char *p = NULL;
p = b(p);
printf("%s", p);
return 0;
}
char * b(char * ptr) {
ptr = "test string";
return ptr;
}
Hier p
-NULL
initialisiert wird nicht definiertes Verhalten zu vermeiden, ein Passieren nicht initialisierter Wert für eine Funktion. Sie könnten auch in ein anderes Zeichenfolgenliteral initialisieren. Inside b
, ptr
ist eine Kopie des Zeigers , der an b
übergeben wurde. Wenn Sie den in ptr
gespeicherten Wert der Adresse des Zeichenfolgenliterals "test string"
erneut zuweisen, ist der ursprüngliche Zeiger p
unverändert. Durch Übergabe von ptr
zurück an die aufrufende Funktion und Neuzuweisung von an den Rückgabewert b
kann die aufrufende Funktion den aktualisierten Wert verwenden.
Wie @M.M in den Kommentaren darauf hinweist, ist dies etwas redundant. Die Funktion b()
könnte stattdessen einen Zeiger seiner eigenen, erklärt wörtliche in eine Zeichenfolge initialisiert:
int a(void) {
char *p = b();
printf("%s", p);
return 0;
}
char * b(void) {
char *ptr = "test string";
return ptr;
}
Ich weiß, das pingelig, aber ich würde 'char ändern **' auf 'const char **', weil es eine Konstante ist Zeichenfolge. – d3L
ich selbst bin nicht in der Verwendung von const pointer versiert, also kann ich das nicht vorschlagen. – Pbd
'" Print-Anweisung "' ist eine konstante Zeichenfolge und wird höchstwahrscheinlich innerhalb des schreibgeschützten Abschnitts der ausführbaren Datei platziert. Das Ändern wird zu einem Absturz führen. 'const char *' '' verhindert die Änderung der Zeichenfolge. – d3L