Hallo zusammen, ich bin absolute Anfänger beim programmieren. kann mir jemand vielleicht helfen, wie viel Byte groß ist Array[6]? typedef struct { unsigned char Test1; unsigned char* Test2; } Test; Test Array[6]; Vielen Dank im Vorraus Gruß Peter
peter schrieb: > ich bin absolute Anfänger beim programmieren. ------------------^ --------------^------------- In der Rächdschraipunk auch nicht ganz vorne dabei.
Ingo Less schrieb: > 6x 2 Byte = 12 Byte. So auchm Bauch raus... Kann man so nicht sagen, da ist ein pointer in der struct, dessen Größe kann man ohne Wissen über das System nicht vorhersagen.
Je nach System wird da noch mit padding-Bytes aufgefüllt. Ziemlich sicher ist da nur, daß das Array letzendlich 6 mal so groß ist wie ein einzelnes Element. Das Stichwort sizeof() ist ja schon gefallen, also probier es einfach aus. Oliver
Es ist 6x sizeof(Test). sizeof(unsigned char) sind 1 Byte. Der Zeiger ist abhängig vom System, aktuellere Prozessoren 32Bit (4Byte) oder sogar 64Bit (8Byte) So, und dann kommt noch hinzu, dass in einem Struct die Variablen an ihren Größen gerne 'aligned' abgelegt werden. Ein 32Bit Variable liegt also gerne mal an einer 32Bit Speichergrenze, d.h. die niedrigsten (4-1)Bit in der Adresse sind 0. Es kann also sein, dass so ein Struct 6x 16Byte wegnimmt oder auch nur 6x 2Byte auf einem 8Bit Mikrocontroller. Gruß Daniel
Dazu wird noch das Alignement kommen. Sicher kann dir das der Compiler sagen. Mit sizeof(Array) Aber nur dort, wo das Array auch ein Array ist (in dem Scope, wo es definiert ist)
Ingo Less schrieb: > Hatte den Stern übersehen :( Selbst dann .... Habe mal getestet, wie weit die Spanne so im Extrem gehen kann: Arduino UNO sagt 18 Byte ESP8266 sagt 48 Byte Sipeed Maix Dock M1W sagt 96 Byte Das ist u.U. schon erheblich mehr als 12 Byte Testcode:
1 | typedef struct |
2 | {
|
3 | unsigned char Test1; |
4 | unsigned char* Test2; |
5 | } Test; |
6 | |
7 | Test Array[6]; |
8 | |
9 | void setup() |
10 | {
|
11 | Serial.begin(9600); |
12 | |
13 | }
|
14 | |
15 | void loop() |
16 | {
|
17 | Serial.println(sizeof(Array)); |
18 | }
|
Pointer schrieb: > ohne Wissen über das System Eben.
peter schrieb: > Pointer schrieb: > kann man ohne Wissen über das System nicht vorhersagen > > was meinst du damit? Das wurde jetzt lang und breit erklärt, liest du immer nur halbe Sätze?
Oliver S. schrieb: > Ziemlich > sicher ist da nur, daß das Array letzendlich 6 mal so groß ist wie ein > einzelnes Element. Und die Größe einer struct wird so bemessen, dass sie bei einem Array ohne Füllbytes auskommt.
1 | typedef struct |
2 | {
|
3 | unsigned char* Test2; |
4 | unsigned char Test1; |
5 | } Test; |
hat dieselbe Größe
peter schrieb: >> kann man ohne Wissen über das System nicht vorhersagen > was meinst du damit? Weil die Struktur bei unterschiedlichen Systemen und Compilern unterschiedlich groß sein kann.
Dirk B. schrieb: > Oliver S. schrieb: >> Ziemlich >> sicher ist da nur, daß das Array letzendlich 6 mal so groß ist wie ein >> einzelnes Element. > > Und die Größe einer struct wird so bemessen, dass sie bei einem Array > ohne Füllbytes auskommt. > typedef struct > { > unsigned char* Test2; > unsigned char Test1; > } Test;hat dieselbe Größe Wenn ich auf einem 32Bit Arm mit hartem Alignment arbeite, ist Test2 immer an 32Bit Grenzen ausgerichtet. Das heißt aber auch, dass nach Test1 drei ungenutze Bytes liegen. Gruß Daniel
peter schrieb: > ...also ich habe einen 32Bit System. Das reicht nicht aus als Information. Du musst schon Prozessorarchitektur und Compiler (evtl. auch Version) spezifizieren, denn genau die legen das fest. Oder du machst einfach ein printf("%d\n", sizeof(Array)) und lässt dir die Antwort vom gleichen Compiler geben, der auch die Struktur baut.
S. R. schrieb: > Oder du machst einfach ein printf("%d\n", sizeof(Array)) sizeof gibt ein size_t zurück. Darum:
1 | printf("%zu\n", sizeof(Array)); |
peter schrieb: > ...also ich habe einen 32Bit System. D.h. ich habe 6 x 5 Byte = 30 Byte > ? Wahrscheinlicher ist 1 Byte für char + 3 Padding Byte 4 Byte für Zeiger Sind zusammen 8 Byte für die struct. Also 6 * 8 Byte
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.