2016-12-02 3 views
0

Ich habe Funktionen, die Speicher dynamisch zuweisen, um Strings in char *** (ein 2D-Array von Strings oder 3D-Array von Zeichen) zu speichern.C Speichern von String-Literalen in dynamischen 2D-Arrays

Ich dachte später, dass es besser wäre, wenn ich sie als String-Literale speichern würde, so änderte ich mein Array zu const char ***. Dies gibt mir jedoch Fehler, wenn ich strcpy() und free() verwende.

error: passing argument 1 of 'strcpy' discards 'const' qualifier from pointer target type 

Ich verstehe, dass die Parameter strcpy() und free() nehmen sind vom Typ char * und void *, aber ich habe auch gelesen, dass es gute Praxis Strings zu speichern in const char * statt char *.

Wie soll ich String-Literale verwenden, wenn es nicht für Operationen wie strcpy() oder free() verwendet werden kann? Sollte ich es als char *** anstelle von const char *** verlassen haben? Da ist etwas Offensichtliches, das ich nicht verstehe.

+1

Weder ein Objekt vom Typ 'char ***' noch das Objekt, auf das es zeigt, ist ein 2D-Array von Strings oder ein 3D-Array von 'char', und diese sind selbst voneinander verschieden. Im Allgemeinen sind Arrays und Zeiger nicht alle gleich und mehrdimensionale Arrays sind Arrays von Arrays, nicht Arrays von Zeigern. –

Antwort

1

Wie ich verstanden habe, enthält Ihr Array keine Zeiger auf String-Literale, sondern enthält Kopien von String-Literalen. Ansonsten wofür wird strcpy verwendet? Sie können also das Konst-Qualifikationsmerkmal aus der Deklaration des Arrays (oder des entsprechenden Zeigers) entfernen. Berücksichtigen Sie, dass in C-String-Literalen Arten von nicht-konstanten Arrays enthalten sind.

+0

Wenn, sagen wir, ich wollte 'const char ***' verwenden, sollte ich 'strcpy()' nicht verwenden, sondern das String-Literal direkt zuweisen? z.B. 'const char * a =" foo "; const char * b = a'? Und gibt es einen freien String Literale ('const char *')? – thestateofmay

+0

@thestateofmay Wenn Sie Zeiger auf String-Literale speichern wollen, können Sie den Qualifier const verwenden. String-Literale haben eine statische Speicherdauer. –

+0

@thestateofkann man nur Objekte freigeben, die man dynamisch zugewiesen hat. String-Literale werden nicht dynamisch zugewiesen (was durch Vlads Bemerkung, dass sie statische Speicherdauer haben, vermittelt wird, aber ich bin unsicher, ob Sie das erkennen). –

Verwandte Themen