Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Einfaches sizeof auf struct berechnet falsche Größe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
14.06.2004, 20:12 Uhr
bürgi



Bitte helf mir folgender Code bringt mich zur Verzweiflung:
Bei mir kommt jedesmal 16 als Größe raus.
Nach meinen Berechnungen müsste aber eigentlich 2+4+2+2+4=14 nicht 16.

C++:
#include <stdio.h>

typedef struct tagBITMAPFILEHEADER {
    unsigned char   bfType[2];
    unsigned long   bfSize;
    unsigned short  bfReserved1;
    unsigned short  bfReserved2;
    unsigned long   bfOffBits;
} BITMAPFILEHEADER;

main()
{
  printf("sizeof(BITMAPFILEHEADER): %d\n",sizeof(BITMAPFILEHEADER));
}


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.06.2004, 20:20 Uhr
Tommi Bisic



vielleicht liegt es an dem Array?Du hast eine 2 da drin stehen.Damit sind es 3 Felder:0,1,2
Bin mir aber net sicher
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.06.2004, 20:22 Uhr
bürgi



THX für die schnelle Antwort.
Aber:ein array mit der Größe 2 hat die Felder 0 und 1, also 2;
100%.
sizeof(unsigned char[2])=2

Dieser Post wurde am 14.06.2004 um 20:24 Uhr von bürgi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.06.2004, 20:30 Uhr
ao

(Operator)


Das liegt daran, dass der Compiler Lücken lassen und die Member so ausrichten darf, dass der Zugriff optimal schnell erfolgt. Normalerweise spielen diese blinden Bytes keine Rolle, und der Performancegewinn kann erheblich sein.

Für vorgeschriebene Speicherlayouts (Bitmap-Header und so) gibts Compileroptionen, mit denen man eine bestimmte Ausrichtung erzwingen kann. Welchen Compiler benutzt du?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.06.2004, 20:33 Uhr
bürgi



Mingw gcc über devcpp.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.06.2004, 20:38 Uhr
0xdeadbeef
Gott
(Operator)



C++:
unsigned char bfType[2];


deklariert ein 2 Zeichen langes unsigned char-Array. bfType[2] liegt also außerhalb des Arrays.

Ich hab mal ein kleines anderes Programm geschrieben:

C++:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

typedef struct tagBITMAPFILEHEADER {
    unsigned char   bfType[2];
    unsigned long   bfSize;
    unsigned short  bfReserved1;
    unsigned short  bfReserved2;
    unsigned long   bfOffBits;
} BITMAPFILEHEADER;

main()
{
  BITMAPFILEHEADER b;
  int fd;

  b.bfType[0] = 'a';
  b.bfType[1] = 0;
  b.bfSize = 0x01F001F0;
  b.bfReserved1 = 0x3412;
  b.bfReserved2 = 0x7856;
  b.bfOffBits = 0xEFBEADDE;

  fd = open("bla", O_WRONLY | O_CREAT);
  write(fd, (char*) &b, sizeof(BITMAPFILEHEADER));
  close(fd);

  return 0;
}


Und bla nachher durch nen hexviewer gejagt. Das Ergebnis war:

Code:
00000000 61 00 16 40 f0 01 f0 01 12 34 56 78 de ad be ef a..@.....4Vx....


Da hast du die zwei überschüssigen, direkt hinter bfType. Den Grund hat ao schon genannt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 14.06.2004 um 20:39 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.06.2004, 20:39 Uhr
ao

(Operator)


Los, Leute, wer hat gcc und kann bürgi mal eben sagen, wie die Anweisung heißt, mit der man das Member-Alignment einstellt?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.06.2004, 20:45 Uhr
bürgi



Dass heißt wenn ich den char array in einen short umwandle un dann
bfType = 'M' << 8 + 'B'
schreib müsste es funzen oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.06.2004, 20:51 Uhr
~Michael
Gast


Hmm nach einigen Spielen denke ich es ist ne Optimierung.
Wenn man nur ein char in das struct steckt (auch array) dann erkennt er die Größe. Steckt man aber noch was mit rein was 4 Bit groß ist, zb long, dann versucht er immer auf gane vielfache von 4 Byte zu gehen.
Ich habe testweise mal 5 char in das Array gesteckt und siehe da er geht auf 20 hoch. Ich habe es auch nicht geschafft diese Optimierung zu deaktivieren
.

Ich habe jetzt nicht genau getestet ab wann er die Optimierung einschaltet. also was passiert wenn man 2 Array's im struct hat, aber jetzt weißt du was es ist und kannst ja selbst bissel testen

mfg Michael
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.06.2004, 20:53 Uhr
bürgi



Wie schreibt man dann die Header bei anderen funzts immer, bei mir nicht!
Shit compiler mischt sich viel zu sehr ein. ^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: