Array-Größe



  • Hmmm,... richtig, in de Musterlösung steht allerdings 38 Byte - na ganz klasse.

    Wo kommen denn die zwei fehlenden Bytes her?

    int einwohner, flaeche haben doch je 4 Byte. Da kann es doch nur am array liegen. Ok die 0,1,2,3....30 sind 31 Byte, aber dan fehlt mir immer noch eins, wird das \0 auch noch draufaddiert? Dachte das wäre in den 30 Elementen drin *grübel*

    Gruß juniorcrew



  • juniorcrew schrieb:

    Hmmm,... richtig, in de Musterlösung steht allerdings 38 Byte - na ganz klasse.

    Wo kommen denn die zwei fehlenden Bytes her?

    int einwohner, flaeche haben doch je 4 Byte. Da kann es doch nur am array liegen. Ok die 0,1,2,3....30 sind 31 Byte, aber dan fehlt mir immer noch eins, wird das \0 auch noch draufaddiert? Dachte das wäre in den 30 Elementen drin *grübel*

    Gruß juniorcrew

    Das Terminierungszeichen muss mitgezählt werden. Der String "Test" würde also 5 Zeichen belegen, da er intern so dargestellt wird:

    T e s t \0
    


  • Bedeutet also:

    Array = 30 Byte -> bestätigt sizeof
    trotzdem verste ich dann noch nciht wie sich die 40 Byte zusammen setzen,... kann Jemand helfen?

    Gruß juniorcrew



  • iopiopio schrieb:

    juniorcrew schrieb:

    Hmmm,... richtig, in de Musterlösung steht allerdings 38 Byte - na ganz klasse.

    Wo kommen denn die zwei fehlenden Bytes her?

    int einwohner, flaeche haben doch je 4 Byte. Da kann es doch nur am array liegen. Ok die 0,1,2,3....30 sind 31 Byte, aber dan fehlt mir immer noch eins, wird das \0 auch noch draufaddiert? Dachte das wäre in den 30 Elementen drin *grübel*

    Gruß juniorcrew

    Das Terminierungszeichen muss mitgezählt werden. Der String "Test" würde also 5 Zeichen belegen, da er intern so dargestellt wird:

    T e s t \0
    

    Ah, das ist in dem Kontext falsch. Wenn du ein Array mit 30 Zeichen anlegst, dann werden auch nur diese 30 Zeichen gezählt. Würdest du einen String mit 30 Zeichen anlegen, DANN wäre es kritisch, da kein Terminierungszeichen mehr untergebracht werden kann.



  • Ja das ist mir schon klar, aber jetzt mal speziell auf diese Aufgabenstellung bezogen. Wo kommen die 40 Byte her?

    30 sind vom array, 8 von den beiden Integer und die restlichen zwei? wo kommen die her?

    wenn ich die structur ändere auf:

    struct person
    { char tes[30];
    int test;};

    komme ich mit sizeof schon auf 36 Byte, wie kann das sein?

    Gruß juniorcrew



  • juniorcrew schrieb:

    Ja das ist mir schon klar, aber jetzt mal speziell auf diese Aufgabenstellung bezogen. Wo kommen die 40 Byte her?

    30 sind vom array, 8 von den beiden Integer und die restlichen zwei? wo kommen die her?

    wenn ich die structur ändere auf:

    struct person
    { char tes[30];
    int test;};

    komme ich mit sizeof schon auf 36 Byte, wie kann das sein?

    Gruß juniorcrew

    Eventuell wird ein Padding vorgenommen.



  • So ich habe das Problem gefunden, es liegt vermutlich daran:

    "...damit das nächste Element wieder an einer 4-Byte-Grenze ausgerichtet ist."

    Damit wäre 32(4 Byte Grenze) + 4 + 4 = 40 Byte

    Danke für Eure Mühen 🙂

    juniorcrew



  • juniorcrew schrieb:

    struct person
    { char tes[30];
    int test;};
    komme ich mit sizeof schon auf 36 Byte, wie kann das sein?

    'int' hat bei dir wohl 4 bytes, also packt er noch zwei füllbytes hinter das array, damit der einzelne 'int' an einer durch 4 teilbaren adresse (struct-anfang + 32) liegt. vorausgesetzt, die struct beginnt selber an einer durch 4 teilbaren adresse, aber dafür wird der compiler schon sorgen.
    🙂



  • Kannst du als Erklärung nochmal hier nachlesen:

    http://www.win-tux.de/c_017_011.htm



  • um sowas zu verhindern könntest du dir das struct in einem stück definieren und selbst aufteilen, das soll jetzt kein beispiel für gute programmierung sein sondern eher eine notlösung 😉

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define getName(x)      ((char*)(x))
    #define getEinwohner(x) *((int*)(((char*)x)+30))
    #define getFlaeche(x)   *((int*)(((char*)x)+34))
    
    typedef struct _noAlign{
      char data[38];
    }noAlign;
    
    typedef struct _aligned{
      char data[30];
      int a;
      int b;
    }aligned;
    
    int main(void) {
    	noAlign xx;
    	noAlign *x = &xx;
    	strcpy(getName(x),"hello");
    	getEinwohner(x) = 0xffaabbcc;
    	getFlaeche(x) = 0x11;
    	getEinwohner(x) += getFlaeche(x);
    	printf("%x\n",getEinwohner(x));
    	printf("%d\n",sizeof(xx));
    	printf("%d\n",sizeof(aligned));
    	return 0;
    }
    

    lg lolo



  • evtl. sollte man zur sicherheit noch sowas in der richtung rein bauen

    #include <limits.h>
    
    ...
    
    #if !defined(UINT_MAX) || !defined(UCHAR_MAX) || UINT_MAX != 0xFFFFFFFF || UCHAR_MAX != 0xFF
    #  error "lolo loves the preprocessor"
    #endif
    

    lg lolo


Anmelden zum Antworten