2012-12-03 3 views
18

Ich erhalte den Fehler "Konvertierung von Zeichenfolgenliteral in Char * ist veraltet" in meinem Code. Der Zweck des Codes besteht darin, einen Zeiger auf einen Zeiger zu verwenden, um string1 und string2 ein Wort zuzuweisen und ihn dann auszudrucken. Wie kann ich das beheben?Konvertierung von Zeichenfolgenliteral in Char * ist veraltet

Hier ist mein Code:

#include <iostream> 
using namespace std; 

struct WORDBLOCK 
{ 
    char* string1; 
    char* string2; 
}; 

void f3() 
{ 
    WORDBLOCK word; 

    word.string1 = "Test1"; 
    word.string2 = "Test2"; 


    char *test1 = word.string1; 
    char *test2 = word.string2; 

    char** teststrings; 

    teststrings = &test1; 
    *teststrings = test2; 

    cout << "The first string is: " 
     << teststrings 
     << " and your second string is: " 
     << *teststrings 
     << endl; 
} 
+1

Ich habe Ihren Code ein wenig redapea bearbeitet ttting die Ausgabe-Anweisung, so dass es gelesen werden kann, ohne zu scrollen und ein paar der notwendigen Zeilen an der Spitze hinzuzufügen. –

+0

Kennzeichnung als Duplikat für zukünftige Suchvorgänge [Veraltete Konvertierung von Zeichenfolgenliteral in 'char \ *'] (http://stackoverflow.com/questions/9650058/deprecated-conversion-from-string-literal-to-char) –

Antwort

39

C++ Stringliterale sind Arrays von konstchar, was bedeutet, dass Sie sie rechtlich nicht ändern können.

Wenn Sie ein Zeichenfolgeliteral sicher einem Zeiger zuweisen möchten (was eine implizite Konvertierung von Array in Zeiger erfordert), müssen Sie den Zielzeiger als const char* deklarieren, nicht nur als char*.

Hier ist eine Version des Codes, der ohne Warnungen kompiliert:

#include <iostream> 

using namespace std; 

struct WORDBLOCK 
{ 
    const char* string1; 
    const char* string2; 
}; 

void f3() 
{ 
    WORDBLOCK word; 

    word.string1 = "Test1"; 
    word.string2 = "Test2"; 

    const char *test1 = word.string1; 
    const char *test2 = word.string2; 

    const char** teststrings; 

    teststrings = &test1; 
    *teststrings = test2; 

    cout << "The first string is: " 
     << teststrings 
     << " and your second string is: " 
     << *teststrings 
     << endl; 
} 

Überlegen Sie, was, wenn die Sprache passieren könnte nicht Diese Einschränkung auferlegen tat

#include <iostream> 
int main() { 
    char *ptr = "some literal"; // This is invalid 
    *ptr = 'S'; 
    std::cout << ptr << "\n"; 
} 

A (Nicht-const) char* können Sie die Daten ändern, auf die der Zeiger zeigt. Wenn Sie ein Zeichenfolgenliteral (das implizit in einen Zeiger auf das erste Zeichen der Zeichenfolge konvertiert wird) in eine einfache char* zuweisen, können Sie diesen Zeiger verwenden, um das Zeichenfolgenliteral ohne Warnungen durch den Compiler zu ändern. Der ungültige Code oben, wenn es gearbeitet,

drucken würde
Some literal 

- und es könnte tatsächlich tun so auf manchen Systemen. Auf meinem System stirbt es jedoch mit einem Segmentierungsfehler ab, weil es versucht, in einen Nur-Lese-Speicher zu schreiben (kein physisches ROM, sondern Speicher, der vom Betriebssystem als schreibgeschützt markiert wurde).

(Nebenbei: C-Regeln für Stringliterale verschieden von C++ 's Regeln in C, ein Zeichenfolgenliteral ein Array von char ist, nicht ein Array von const char - aber versuchen, zu modifizieren Verhalten nicht definierte Diese.. bedeutet, dass Sie in C char *s = "hello"; s[0] = 'H'; legal schreiben können, und der Compiler wird sich nicht unbedingt beschweren - aber das Programm wird wahrscheinlich mit einem Segmentierungsfehler sterben, wenn Sie es ausführen.Dies wurde getan, um Rückwärtskompatibilität mit C-Code vor der const geschrieben zu erhalten Schlüsselwort wurde eingeführt. C++ hatte const von Anfang an, so dass dieser bestimmte Kompromiss nicht notwendig war.)

+0

Das war unglaublich klar, einfallsreich und aufschlussreich. Danke für deine Hilfe, ich verstehe es jetzt viel besser! –

+0

Die Erklärung ist großartig, aber der Code ist unklar und verwirrend - es sieht so aus, als würden Sie "Test1" und "Test2" drucken, während Sie tatsächlich den Wert von testrings drucken (ein Offset, der auf "test1" zeigt) und der String zeigt um 'test1' (was" Test2 "ist, weil Sie' test1' durch teststrings geändert haben) – neuviemeporte

+0

@neuvievermepte: (Ich weiß, dass ich ein bisschen spät antworte.) Alles was ich getan habe, war das Hinzufügen von "const" -Schlüsselwörtern zum OP-Code . Ich habe nicht versucht, weitere Korrekturen oder Verbesserungen vorzunehmen. –

Verwandte Themen