Array größe berechnen

#6124732
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
Gast #6124733
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
Gast #6124739
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.
#6124743
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
Gast #6124750
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
#6124792
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.