Array-Größe
-
struct stadt { char name[30]; int einwohner; int flaeche; /* Die Fläche wird in Quadratkilometern angegeben */ }; main () { struct stadt s1 = {"Gelsenkirchen",277827,104}; struct stadt s2 = {"Bochum",396136,145};
Frage:
Wieviel Speicherplatz belegen die Variablen s1 und s2?Muss ich da den kompletten Array betrachten oder das was wirklich reingeschrieben wurde?
Gruß juniorcrew
-
juniorcrew schrieb:
Wieviel Speicherplatz belegen die Variablen s1 und s2?
mindestens 30 + 2*sizeof(int) pro variable, wahrscheinlich mehr, wenn die ints an durch sizeof(int) teilbaren adressen beginnen usw.
juniorcrew schrieb:
Muss ich da den kompletten Array betrachten oder das was wirklich reingeschrieben wurde?
diese 30 bytes sind immer da, egal wieviel du davon brauchst.
-
Da das char-Array eine fixe Größe hat, werden diese Bytes auch belegt. Ganz egal, ob du da nun 2, 17 oder 30 Character reinschreibst.
-
juniorcrew schrieb:
Frage:
Wieviel Speicherplatz belegen die Variablen s1 und s2?Antwort:
sizeof(s1) und sizeof(s2) Bytes.
Kannst du gucki machen:printf("%d\n", sizeof(s1));
Sind bei mir 40 Bytes.
-
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:
-
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