C: Read-ony-zeiger wird trotzdem verändert.

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Gutschy, 21. März 2016 .

Schlagworte:
  1. 21. März 2016
    Hallo Leute,

    mein Lehrbuch schreibt das ein Zeiger der als const deklariert wird nicht veränderbar ist. Wenn ich es trotzdem mache dann meckert der Compiler, aber er lässt es auch zu. Und das sollte laut meinen Buch nicht passieren können.

    Code:
    /* const_ptrV.c */
    #include <stdio.h>
    #include <stdlib.h>
    
    void funktion1(const char *str) {
     char *ptr;
    
     ptr = str+5;
     *ptr = '-';
    }
    
    int main(void) {
     char string1[] = "Hallo Welt\n";
    
     funktion1(string1);
     printf("%s\n",string1);
     return EXIT_SUCCESS;
    }
    In der Funktion funktion1 ist der Zeiger *str als Konstante gekennzeichnet. Trotzdem wird *str durch *ptr manipuliert. Wie gesagt, der Compiler gibt eine Warnung aus. Kann man dem Compiler ein anderes flag mitgeben damit er abbricht oder ähnliches?

    Nachtrag:
    Compeliert wird mit gcc auf Debian Wheezy.

    Gruss,

    Gutschy
     
  2. 26. März 2016
    AW: C: Read-ony-zeiger wird trotzdem verändert.

    Code:
    cs@rubick:~/Code$ ls
    a.out test.c
    cs@rubick:~/Code$ rm a.out 
    cs@rubick:~/Code$ gcc test.c -Werror
    test.c: In function ‘funktion1’:
    test.c:8:8: error: assignment discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
     ptr = str+5;
     ^
    cc1: all warnings being treated as errors
    cs@rubick:~/Code$ ls
    test.c
    
    Wie man oben sehen kann, dem Compiler einfach den -Werror flag mitgeben.

    Alternativ, guck dir mal den Code an:
    Code:
    /* const_ptrV.c */
    #include <stdio.h>
    #include <stdlib.h>
    
    void funktion1(char *str) {
     *(str+5) = '-';
    }
    
    int main(void) {
     char string1[] = "Hallo Welt\n";
    
     funktion1(string1);
     printf("%s\n",string1);
     return EXIT_SUCCESS;
    }
    
    und diesen:

    Code:
    /* const_ptrV.c */
    #include <stdio.h>
    #include <stdlib.h>
    
    void funktion1(char *str) {
     *(str+5) = '-';
    }
    
    int main(void) {
     const char string1[] = "Hallo Welt\n";
    
     funktion1(string1);
     printf("%s\n",string1);
     return EXIT_SUCCESS;
    }
    
    Code:
    cs@rubick:~/Code$ gcc test.c 
    test.c: In function ‘main’:
    test.c:12:14: warning: passing argument 1 of ‘funktion1’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
     funktion1(string1);
     ^
    test.c:5:6: note: expected ‘char *’ but argument is of type ‘const char *’
     void funktion1(char *str) {
     ^
    
    Code:
    /* const_ptrV.c */
    #include <stdio.h>
    #include <stdlib.h>
    
    void funktion1(const char *str) {
     *(str+5) = '-';
    }
    
    int main(void) {
     char string1[] = "Hallo Welt\n";
    
     funktion1(string1);
     printf("%s\n",string1);
     return EXIT_SUCCESS;
    }
    
    Code:
    cs@rubick:~/Code$ gcc test.c 
    test.c: In function ‘funktion1’:
    test.c:6:11: error: assignment of read-only location ‘*(str + 5u)’
     *(str+5) = '-';
     ^
    
    Ich hoffe das macht dir deutlich, warum in deinem genauen Beispiel der Compiler nur ein bischen rummeckert anstatt sofort zu erroren, wie in meiner Anpassung
     
  3. 31. März 2016
    AW: C: Read-ony-zeiger wird trotzdem verändert.

    Hey ChillingStream,

    vielen Dank für deine detaillierte Ausführung und entschuldige das ich mich erst jetzt melde, aber mein Job ist wirklich mega schlauchig.

    Zu deinen Auführungen: jetzt kenne ich schon mal Werror 'Make all warnings into errors'. In deinen Beispielen willst du wohl darauf hinaus das ein String als Konstante auf keinen Fall überschrieben werden kann, ein Pointer als Konstante allerdings schon, oder?

    Hoffe ich habe deinen Ausführungen so komplett nachvollzogen und noch mal vielen Dank !!! :]

    Viel Grüsse,

    gutschy
     
  4. 1. April 2016
    AW: C: Read-ony-zeiger wird trotzdem verändert.

    Worauf ich eigentlich hinaus wollte ist, dass du in deinem Beispiel einen pointer erstellst, der auf einen einzelnen character Zeigt, der IN deinem character-array ist.
    Code:
     char *ptr; //erstelle einen pointer zu einem character
    
     ptr = str+5; //nehme den pointer STR und springe 5 character "slots" weiter "Hello5World"
     *ptr = '-'; // nun fügen wir '-' ein an der stelle wo wir hingezeigt haben -------^
    
    prinzipiell weiß der compiler nicht, dass die stelle dort const sein soll
     
  5. 6. September 2016
    AW: C: Read-ony-zeiger wird trotzdem verändert.

    Soll das heißen, wenn ich über einen Zeiger einen einzelnen Charackter in einem String manipuliere geht das, obwohl der String eine Constante ist, vorausgesetzt das die Funktion in der er manipuliert wird ihn nicht als Constante aufruft.

    Ok, das war jetzt wohl ziemlich blöd beschrieben. Aber wenn ich einen String als const deklariere, dann sollte er doch schon gar nicht über einen Zeiger manipulierbar sein, auch wenn dieser Zeiger über eine neue Funktion kommt.

    Chilling Stream, großes Entschuldigung das ich mich erst nach 5 Monaten wieder melde. Ich erwarte auch ehrlich gesagt keine Antwort von dir.
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.