Stack arround variable zahl is corrupt



  • Hallo kann mir mal bitte jemand erklären wieso hier hier ein Fehler raus kommt?

    #include <stdio.h>
    
    int main (void)
    {
    
    	int zahl;
    	int* pzahl = &zahl;
    	double pi=3.1456;
    	double* ppi = (double*)pzahl;
    
    	*ppi = pi;
    
    	printf("Wert: %lf \n",*ppi);
    	return 0;
    }
    


  • Hans121 schrieb:

    int zahl;
    int* pzahl = &zahl;
    ...
    double* ppi = (double*)pzahl;
    }
    

    offensichtlich ist auf deinem system sizeof(double) > sizeof(int), d.h. diese int-variable 'zahl' reicht nicht aus, um einen 'double' zu speichern. da du selbiges aber versuchst (*ppi = pi), kracht es.
    🙂



  • Das versteh ich nicht sorecht hat nicht Double und int beide 32 bit ?



  • Vergiss was ich gerade oben geschrieben habe ^^

    Ok das verstehe ich schon int benötigt 4 Bytes und Double 8 Bytes.
    Nur müsste das nicht auf jedem System gleich sein? Weil du meintest auf deinem System.



  • Hans121 schrieb:

    Nur müsste das nicht auf jedem System gleich sein? Weil du meintest auf deinem System.

    naja, das kann schon ziemlich unterschiedlich sein. 'int' muss mindestens 16 bits haben, nach oben hin gibts keine grenze. 'double' hat, wenn dein compiler diese IEEE-double-format verwendet, 64 bits. verwendet er irgendein anderes format, dann haste doppelt (äääh double) pech.

    sprit of C schrieb:

    5. Make it fast, even if it is not guaranteed to be portable.

    🙂



  • ;fricky schrieb:

    offensichtlich ist auf deinem system sizeof(double) > sizeof(int), d.h. diese int-variable 'zahl' reicht nicht aus, um einen 'double' zu speichern. da du selbiges aber versuchst (*ppi = pi), kracht es.
    🙂

    Bei mir kommt keine Fehlermeldung wenn ich das so compiliere und die Ausgabe ist 3,145600.

    Wenn ich das compiliere

    #include <stdio.h>
    
    int main (void)
    {
    	int zahl1=1;
    	double zahl2=1.0;
    
    	printf("Groesse von Zahl1: %i\n", sizeof(zahl1));
    	printf("Groesse von Zahl2: %i", sizeof(zahl2));
    
    	return 0;
    }
    

    kommt
    Größe von Zahl1: 4
    Größe von Zahl2: 8



  • also bei mir läufts auch ohne Fehler ( win xp + pelles c )

    p.s. dein wert fuer pi ist aber ff ( föllich falsch: http://de.wikipedia.org/wiki/Kreiszahl 😋



  • Mir gings dabei auch weniger um den wert pi sonder eher darum das ich das casten von zeigern verstehe. Also könnte man Generell sagen das man das casten von zeiger vermeiden sollte da es probleme bei der internen darstellung der formate geben könnte. (ausgenommen null zeige cast)



  • Nur was ich net so ganz verstehe es hängt ja davon ab ob ein Fehler auftritt welche WORD Größe die CPU besitz, das müsste ja bei Desktop PCs heutzutage entweder 32 oder 64bit sein oder nicht. Oder hängt das auch damit zusammen ob man ein 32 bit bzw 64bit Betriebssystem verwendet.



  • Hans121 schrieb:

    Also könnte man Generell sagen das man das casten von zeiger vermeiden sollte da es probleme bei der internen darstellung der formate geben könnte. (ausgenommen null zeige cast)

    Nö, man darf das. ZB ist sowas ganz in Ordnung:

    struct object
    {
      int flags;
      void *pt;
    } o;
    
    /* wenn mir 'o.flags' sagt, dass 'o.pt' auf einen Bereich zeigt,
       den man als 'int' verwenden kann, dann könnte ich sagen: */
    *(int *)o.pt = 42;
    

    Nur Nullzeiger casten hat irgendwie keinen Sinn.

    Nur was ich net so ganz verstehe es hängt ja davon ab ob ein Fehler auftritt welche WORD Größe die CPU besitz, das müsste ja bei Desktop PCs heutzutage entweder 32 oder 64bit sein oder nicht. Oder hängt das auch damit zusammen ob man ein 32 bit bzw 64bit Betriebssystem verwendet.

    Die Frage ist einfach, wie gross der Compiler auf dem System ein int und ein double macht. Im Normalfall wird er eine Darstellung bevorzugen, mit der die Maschine gut zurechtkommt.
    🙂


Anmelden zum Antworten