Forum: Mikrocontroller und Digitale Elektronik Array größe berechnen


von peter (Gast)


Lesenswert?

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

von Jop (Gast)


Lesenswert?

Stichwort: sizeof()

von Ingo Less (Gast)


Lesenswert?

peter schrieb:
> wie viel Byte groß  ist Array[6]?
6x 2 Byte = 12 Byte. So auchm Bauch raus...

von Deudschleera (Gast)


Lesenswert?

peter schrieb:
> ich bin absolute  Anfänger beim programmieren.
------------------^ --------------^-------------

In der Rächdschraipunk auch nicht ganz vorne dabei.

von Einer K. (Gast)


Lesenswert?

Ingo Less schrieb:
> So auchm Bauch raus...

Ein 1Byte großer Zeiger?

Nööö....

von Pointer (Gast)


Lesenswert?

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.

von Ingo Less (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ein 1Byte großer Zeiger?
Hatte den Stern übersehen :(

von Oliver S. (oliverso)


Lesenswert?

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

von DanielF (Gast)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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)

von Einer K. (Gast)


Lesenswert?

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.

von peter (Gast)


Lesenswert?

Pointer schrieb:
> kann man ohne Wissen über das System nicht vorhersagen

was meinst du damit?

von Pointer (Gast)


Lesenswert?

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?

von Dirk B. (dirkb2)


Lesenswert?

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

von S. R. (svenska)


Lesenswert?

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.

von DanielF (Gast)


Lesenswert?

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

von peter (Gast)


Lesenswert?

...also ich habe einen 32Bit System. D.h. ich habe 6 x 5 Byte = 30 Byte 
?

von DanielF (Gast)


Lesenswert?

Was für ein Alignment hast du im Struct?
8Bit, 16Bit, 32Bit,...

von peter (Gast)


Lesenswert?

DanielF schrieb:
> Was für ein Alignment hast du im Struct?

wie finde ich es raus?

von S. R. (svenska)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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));

von Dirk B. (dirkb2)


Lesenswert?

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
Noch kein Account? Hier anmelden.