Conversion from string literal to 'char *' is deprecated



  • Hallo liebes Forum,

    bei folgendem Code tritt die Fehlermeldung

    *Conversion from string literal to 'char ' is deprecated --> Zeile 36

    auf und ich weiß einfach nicht warum. Programmiert wird mit XCode.

    ---------------------------------------------------------------------------

    #include <iostream>

    class test
    {
    char *name;
    public:
    test(char *nam);
    void get_name();
    };

    test::test(char *nam)
    {
    strcpy(name,nam);
    }

    void test::get_name()
    {
    std::cout << name;
    }

    int main(int argc, const char * argv[])
    {

    test eins("Test");
    eins.get_name();

    }

    --------------------------------------------------------------------------------

    Wäre toll, wenn mir jemand helfen kann.
    Ich hab auch schon erlebt, dass manchmal (nicht bei diesem Beispiel) nicht kompiliert werden konnte,
    weil ein Problem vorlag. Nachdem ich xCode geschlossen und wieder geöffnet hatte, funktionierte der Code problemlos.

    Beste Grüße & noch ein frohes neues Jahr
    Fabian



  • Weisst du denn was ein String literal ist?



  • Ein Stringliteral ist doch ein Objekt der Klasse String, welches die Zeichen zwischen den doppelten Anführungsstrichen enthält.

    Edit:

    Wenn ich schreibe

    test::test(char *nam)
    {
    name = nam;
    }

    Dann funktioniert es.

    Verwende ich strcpy als nur, wenn ich in der test class z.b. char name[10] schreibe?
    Also bei zeichenbegrenzten Arrays?

    name = nam funtioniert, weil es sich um ein Objekt (der Klasse String) handelt, oder?



  • Die von dir angegebene Codezeile kann nicht das Problem sein. Vergleich doch mal die Typen von name und nam

    Und deine Definition von String literal ist falsch. Wie kommst du darauf? Ausserdem benutzt du doch garkeine Objekte vom Typ string. Schau nochmal in deinen Quellen nach!

    Edit: strcpy(name, nam) ist auch nicht das selbe wie name = nam



  • Hui, da sind so viele Fehler drin..
    1. In C++ mag man eher std::string, das ist eine Klasse für die die ganzen intuitiven Operatoren (=, +=, ==, ..) überladen sind, der kümmert sich auch gleich um Speicher etc.

    2. Die Probleme mit deinem Code:
    - Ein String Literal (also alles zwischen "") hat den Typ const char[N], wobei N die Anzahl der Zeichen im Literal + 1 (für die Nullterminierung '\0') ist.
    - Ein Array kann zu einem Pointer auf sein erstes Element zerfallen, deshalb geht folgendes:

    const char* s = "Hallo!"; // s zeigt jetzt auf H
    

    Dank der Nullterminierung muss die Länge nicht separat gespeichert werden.
    Ich hoffe dir sind die kleinen "const" hier aufgefallen. Ein String Literal ist nämlich konstant (du darfst nicht rein schreiben). Das s oben ist z.B. vom Typ "pointer to const char". Heißt, das hier würde einen Compilerfehler geben:

    s[0] = 'L';
    

    Weil der Compiler durch den Typ weiß, dass man das nicht machen soll. Wenn du jetzt aber schreibst

    char* s = "Hallo";
    

    Dann kann dich der Compiler bei

    s[0] = 'L';
    

    nicht mehr davor beschützen etwas Falsches zu machen. Daher ist diese implizite Konvertierung illegal.

    Und du hast noch ein Problem: Bei deinem strcpy: name zeigt nicht auf einen gültigen Speicherbereich!

    Und was ein get_name mit void als Rückgabetyp machen soll, musst du mir auch mal erklären.

    Ein Stringliteral ist doch ein Objekt der Klasse String, welches die Zeichen zwischen den doppelten Anführungsstrichen enthält.

    Ne. Stringliterale sind, wie oben beschrieben, einfach nur Arrays. Nix Klasse. 😉



  • ach cooky ... jetzt hast du wieder einfach alles verraten



  • F4b14n schrieb:

    und ich weiß einfach nicht warum

    Sieht so aus, als hättest du nicht verstanden, was char* bedeutet. Tipp: Es ist kein Typ für String-Variablen. Ist ist ein Typ für Zeiger. Von Zeigern solltest du so lange wie möglich die Finger lassen. Und die Funktionen wie strcpy lässt du am besten ganz bleiben.


Anmelden zum Antworten