Verständnisproblem mit const



  • Hallo

    Wieso funktioniert folgender Code, obwohl ich der Funktion change() einen const-Zeiger übermittle??

    #include <stdio.h>
    
    void change(const int* z)
    {
        *z = 5;
    }
    
    int main()
    {
        int i = 2;
    
        printf("%d\n",i);
        change(&i);
        printf("%d\n",i);
        return 0;
    }
    

    Danke für alle Antworten!

    n00b



  • Hi,

    der Zeiger ist const, nicht das worauf er zeigt.

    Jockel



  • Was hast du für ein Compiler? VisualC++6 meckert



  • gcc warnt immerhin. Das einzige was ich dazu im Standard gefunden habe:

    If an attempt is made to modify an object defined with
    a const-qualified type through use of an lvalue with non-
    const-qualified type, the behavior is undefined.

    Nun bin ich mir nicht sicher, ob hier wirklich ein Zugriff "through use of an lvalue with non-const-qualified type" vorliegt. Auf jeden Fall ist die Semantik eine andere als in C++, das sollte man sich bewußt sein.



  • #include <stdio.h>

    void change(int* z)
    {
    *z = 5;
    }

    int main()
    {
    const int i = 2;

    printf("%d\n",i); //i muss konstant sein
    change(&i);
    printf("%d\n",i);
    return 0;
    }

    -----
    FREAK



  • Original erstellt von <Jockel>:
    der Zeiger ist const, nicht das worauf er zeigt.

    Das stimmt nicht.

    Ansonsten: Ich hab meinen Standard gerade nicht da, um genauer zu suchen, aber aus dem Bauch heraus, würde ich auf undefiniertes Verhalten tippen.



  • jockel, genau andersrum. und deshalb mosert der gcc da auch, man ändert eben keine
    konstanten.. 😉



  • Original erstellt von Bashar:
    Auf jeden Fall ist die Semantik eine andere als in C++

    Wieso?



  • Die Frage sollte sich eigentlich aus dem Thread heraus schon beantworten lassen. Aber nochmal zum Mitmeißeln: Es gibt keine const-correctness in C. Du hast selbst dafür zu sorgen, dass du keinen Mist mit den dir anvertrauten Konstanten anstellst. const ist ein Wink an den Compiler, dass er die entsprechende Variable behandeln kann als würde sie sich nie verändern, mehr nicht. Es führt nicht dazu, Verletzungen dieser Zusicherung aufspüren zu müssen.


Anmelden zum Antworten