Unterschied von char * test[3] und char *const test[3]



  • Hi,
    ich muss einer Funktion einen Pointer auf ein Char-Array übergeben. Wenn ich nun das Ganze so löse:

    char * params[3];
            params[0] = "Das ist";
            params[1] = " ein Test.";
            params[2] = NULL;
    

    meckert mein Compiler:

    warning: deprecated conversion from string constant to ‘char*’
    

    Wenn ich nun meinen Code so ändere:

    [cpp]
            char *const params[3];
            params[0] = "Das ist";
            params[1] = " ein Test.";
            params[2] = NULL;
    

    Gibt mein Compiler einen Fehler aus. Was mache ich hier falsch?

    Mfg Mo3bius



  • es sollte sein

    const char * params[3];
            params[0] = "Das ist";
            params[1] = " ein Test.";
            params[2] = NULL;
    

    const char *params ist ein Zeiger auf eine Konstante.
    char const *params ist ein konstanter Zeiger.
    const char const *params ist ein konstanter Zeiger auf eine Konstante
    char *const params ist ein Syntaxfehler.



  • supertux schrieb:

    char const *params ist ein konstanter Zeiger.
    const char const *params ist ein konstanter Zeiger auf eine Konstante
    char *const params ist ein Syntaxfehler.

    Das ist so nicht ganz korrekt.

    char const *params ist das selbe wie const char *params - eine Zeigervariable auf char-Konstante.
    const char const *params ist ein Fehler; zweimal const auf char geht nicht.
    char *const params ist eine Zeigerkonstante auf char-Variable.

    char const *const params ist eine Zeigerkonstante auf char-Konstante.
    char const *const *const params ...und so weiter halt.

    const bezieht sich immer auf das, was sich direkt zu seiner linken befindet, es sei denn, es steht ganz links, dann bezieht es sich auf das, was direkt zu seiner rechten steht.



  • Ich habe jetzt mal ein bisschen rumgespielt mit den verschiedenen Möglichkeiten.
    Hier meine jetzige Variante:

    char *const params[] = {"/home/simulation","-parameter1",NULL};
    

    Dies benutz ich hier:

    execv("/home/simulation",params);
    

    Das gibt mir aber immer noch die gleiche Warnung aus........

    Mfg Mo3bius



  • seldon schrieb:

    supertux schrieb:

    char const *params ist ein konstanter Zeiger.
    const char const *params ist ein konstanter Zeiger auf eine Konstante
    char *const params ist ein Syntaxfehler.

    Das ist so nicht ganz korrekt.

    char const *params ist das selbe wie const char *params - eine Zeigervariable auf char-Konstante.
    const char const *params ist ein Fehler; zweimal const auf char geht nicht.
    char *const params ist eine Zeigerkonstante auf char-Variable.

    char const *const params ist eine Zeigerkonstante auf char-Konstante.
    char const *const *const params ...und so weiter halt.

    const bezieht sich immer auf das, was sich direkt zu seiner linken befindet, es sei denn, es steht ganz links, dann bezieht es sich auf das, was direkt zu seiner rechten steht.

    in der Tat, ich hatte es anders in Erinnerung, kann auch daran liegen, dass bist auf const char* ich const sonst nicht so oft in anderen Kombinationen verwende.



  • Das Problem ist, dass der von execv angestoßene Programmcode das Parameterarray als argv übergeben kriegt und darin herumschreiben darf. Execv String-Literale zu füttern ist dementsprechend unsicher - wenn der neue Code das macht, hast du gleich einen Segfault.

    Das ist normalerweise nicht besonders kritisch, weil man execv im Zweifel eh nur braucht, wenn man die Parameter zur Laufzeit zusammenklamüsert und schreibbaren Speicher hat. Wenn du sie zur Compilezeit kennst, benutz doch einfach

    execl("/home/simulation", "/home/simulation", "-parameter1", NULL);
    

Anmelden zum Antworten