Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicherfehler

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 <
000
19.12.2007, 00:05 Uhr
banshee



hallo,

ich versuche gerade, eine virtuelle Speicherverwaltung mit C zu programmieren und stoße dabei auf einen höchst ungewöhnlichen Fehler:


C++:
PhysicalPages = (int*)malloc(PAGE_SIZE * NumPhysical);
    memset(PhysicalPages + 4441, 2, 1);


Die erste Zeile entstammt meiner Initialisierungsfunktion und die zweite ist in einer Funktion, die der Benutzer aufruft und die eigentlich ein Byte im Speicher setzen soll.

PAGE_SIZE ist bei mir in der Header mit 4096 definiert und in diesem Testfall ist NumPhysical 3, das heißt ich reserviere mir da 12288 Bytes speicher. Ich habe das memset jetzt mal direkt unter diese Zeile geschrieben, weil ich schon ab Index 4442 einen Speicherfehler bekomme. Wo kommt der denn her? Ich hab doch genug Platz?

/edit: gerade noch eine andere Sache. Wie reserviere ich mir denn am besten Speicher für eine variable ungerade Anzahl an Bits? Also wenn ich zb immer Vielfache von 12 Bits speicher brauche, weil malloc nimmt ja nur Bytes.

Selbiges Problem, wenn ich bei Laufzeit die Arraygröße bestimmen will. Mache das bisher mit (BOOL*)malloc(arraygröße) aber da packe ich dann ja jeweil 1 Bit in 1 Byte, was ja ziemliche Verschwendung ist...

Dieser Post wurde am 19.12.2007 um 00:12 Uhr von banshee editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.12.2007, 00:43 Uhr
0xdeadbeef
Gott
(Operator)


Da PhysicalPages ein int* ist, ist PhysicalPages + 4441 4441 mal sizeof(int) - heutzutage typischerweise 4 - Bytes hinter PhysicalPages.

Speicher kannst du nur in Byte anfordern, wenn du weniger brauchst, rund halt auf Bytes auf. Auf die Bits in einem Byte kannst du über Bitshifting und Binäroperatoren zugreifen, z.B.

C++:
uint32_t x = 0;

x |= 1 << 4; /* Setzt das fünftkleinste Bit von x, also wird x = 32 */
if(x >> 4 & 1) {
  /* fünftkleinstes Bit von x ist gesetzt */
}


Die Operatoren im Einzelnen:

C++:
x & y; /* Binäres und */
x | y; /* Binäres oder */
x ^ y; /* Binäres entweder-oder */
~x; /* Binärkomplement, d.h. bits invers */
x << y; /* x um y bit nach links verschoben */
x >> y; /* x um y bit nach rechts verschoben */


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.12.2007 um 00:44 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.12.2007, 14:17 Uhr
Kest
saint


Hi!

Man könnte auch mit den Bitfeldern arbeiten. Es ist zwar langsamer, als mit den Bytes, aber man spart Speicherplatz.

C++:
struct bits{
    char a : 1;
unsigned b : 2;
     int c : 5;
};


Zwar lässt es sich auch nicht eine bestimmte Anzahl an Bits festlegen, wie z.B. 12, weil ein Byte als die kleinst mögliche Einheit dient, und die Bits also in Bytes untergebracht werden müssen, aber es ist dennoch effiktiver, wenn man viel Speicher verbraucht.
Und ich glaub nicht, dass man die Arraygröße zur Laufzeit bestimmen kann, es sei denn, die Größe war schon vor dem Compilieren bekannt.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 19.12.2007 um 14:19 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: