2017-02-11 2 views
1

Ich möchte einen Char-Zeiger an eine Funktion übergeben und lassen Sie den Wert setzen und zurückgeben. Hier ist mein Versuch, aber der Printf druckt Müll, wo liege ich falsch?C char array pointer

int a() { 
    char *p;  
    b(p);  
    printf("%s", p); 
    return 0; 
} 

int b(char * ptr) { 
    ptr = "test string"; 
    return 0; 
} 

Antwort

3

Übergeben Sie einen Verweis auf den Zeiger.

int b(char **ptr) 
{ 
    *ptr = "Print statement"; 
    //your code 
} 
//call 
b(&p); 
+0

Ich weiß, das pingelig, aber ich würde 'char ändern **' auf 'const char **', weil es eine Konstante ist Zeichenfolge. – d3L

+0

ich selbst bin nicht in der Verwendung von const pointer versiert, also kann ich das nicht vorschlagen. – Pbd

+0

'" 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

2

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; 
} 
+0

Sie wollten 'b' einen Rückgabetyp von' char * 'geben. Aber in diesem Code ist der Funktionsparameter redundant und sollte entfernt werden. (Tatsächlich verursacht 'b (p)' undefiniertes Verhalten durch Verwendung eines nicht initialisierten Zeigerwerts). –

+1

@ M.M-- Danke für den Kommentar. Ich denke, dass jetzt alles geregelt ist. Ich glaube, dass C11 §6.3.2.1 2 über _lvalue conversion_ der relevante Abschnitt für das undefinierte Verhalten ist, das Sie beschreiben: "Wenn der Lvalue ein Objekt mit automatischer Speicherdauer bezeichnet ... und dieses Objekt nicht initialisiert ist ..., ist das Verhalten nicht definiert." Wenn es ein anderes Zitat gibt, das dieser Situation besser entspricht, bitte geben Sie es weiter. –