2016-07-28 16 views
-1

Ist es möglich, eine Zeichenfolge zu einem Zeichenfolgenzeiger in C++ hinzuzufügen? Problem Beispiel:Hinzufügen einer Zeichenfolge zu einem Zeichenfolgenzeiger

String* temp; 
temp[0] = "string"; 

Genau wie es möglich ist, in:

String temp[3]; 
temp[0] = "string"; 

Bevor was darauf hindeutet, nur ein normales Array verwenden oder kopieren Sie sie in einem anderen festen Anordnung, muss der String-Zeiger zurückgegeben werden in eine Funktion. Z.B.

Ich bin auch offen für andere Vorschläge, wie ich ein Array von dieser Funktion zurückgeben kann.

+2

Was ist String? –

+0

Ich wollte die gleiche Frage stellen. Aber wie Sie sehen, hat die Frage Arduino-Tag. String ist ein Objekt der Arduino-Sprache, das auf C oder C++ basiert, aber mit keinem von beiden identisch ist –

Antwort

0

unabhängiges was String diesem Code-Schnipsel

String* temp; 
temp[0] = "string"; 

wenn es Ergebnisse in undefinierten Verhalten kompiliert wird, weil der Zeiger Temperatur hat entweder einen unbestimmten Wert oder NULL (wenn es sich um eine lokale Variable ist), und Sie können nicht Derefence es.

Vorausgesetzt, dass dieser Code

String temp[3]; 
temp[0] = "string"; 

gültig Snippet Sie zum Beispiel

String* other_temp = temp; 
other_temp[0] = "string"; 
0

Sie hinzufügen können, nichts zu POINTER, Zeiger zeigt sich nur bis zu einem gewissen Speicher schreiben kann. Sie müssen zuerst eine Instanz haben, wie in Ihrem zweiten Beispiel String temp[3]; erstellen Sie drei Instanzen von String.

So String temp; wird schaffen lokale Instanz von String, dann ist es Zeiger erhalten Sie String * tempPtr = &temp; verwenden können, aber ich sehe nicht, warum Sie das wünschen würde, wie Sie temp können wie verwenden können ... wie temp.clear(); oder was auch immer Funktionen Die Klasse String hat (siehe API).


Bearbeiten über zurückgeben Stringzeiger.

Das ist eine Art unglücklicher C++ API-Design. Wer wird die Erinnerung an diese Instanz besitzen?

Zum Beispiel:

String* SomeClass::toArray(String str) { 
    String result; 
    // BUG, DO NOT DO THIS! 
    return &result; // returns pointer to local stack variable 
    // which gets released *here*, invalidating the pointer 
} 

String* SomeClass::toArray(String str) { 
    String *result = new String; 
    return result; // returns pointer to global heap 
    // now if the upper layer of code will not call "delete" on it 
    // you have memory leak 
} 

BTW, aus dem "toArray" name sieht es aus wie Sie Array von String-Instanzen wollen, nicht String-Zeiger. So sollten Funktionen eher als String[] SomeClass::toArray(String str) definiert werden, immer noch das gleiche Problem mit Speicherbesitz.


Was ich tun würde ist nicht ein Array zurückgeben. vielleicht void SomeClass::toArray(const String & str, std::vector<String> & array), füllen Sie die Daten in array Vektor.

Ich weiß nicht, wie viel Sie C++ verwenden, auf Arduino, wenn std :: vector in Ordnung ist, oder nicht, aber für String eine Klasse mit fühlt sich an wie Vektor <> auch in Ordnung sein wird, vor allem, wenn Sie Ihren Stack verschwenden indem Sie die Instanz von String anstelle von Referenz kopieren.(es sei denn String ist einige Makro/typedef für char[], bitte, sag mir nicht, dass ... Ich meine, sogar C++ kann in geringem Speicherbedarf geschrieben werden, Sie müssen Arrays nicht überall fest verdrahten, wenn Sie unnötige vermeiden Zuweisung von temporären Instanzen von C++ - Klassen).

Verwandte Themen