Pointer auf struct array bewegen?
-
Hallo Community,
ich möchte gerne einen Zeiger innerhalb eines struct arrays bewegen.
Bsp.:typef struct __mystruct { char c1[255]; char c2[255]; char c3[255]; _mystruct *pnext; } _mystruct; void foo() { int x=5; __mystruct *pstruct=new __mystruct[x]; //Zeroingfrage ::ZeroMemory(pstruct,sizeof(__mystruct*)*x); //so? ::ZeroMemory(pstruct,sizeof(__mystruct)*x); //oder so? delete []_pstruct; } void loop(__mystruct *pstruct, int nlen) { __mystruct *tmp; tmp=pstruct; for (int x=0; x<nlen; x++) { //TODO.... pstruct+=sizeof(*pstruct); //so? pstruct+=sizeof(__mystruct); //oder so? } }
Könnte mir jemand das ein wenig erklären? Ebenfalls bezügl. ZeroMemory, ist hier die Pointergröße oder die Objektgröße relevant?
Danke!
-
ups funktionsaufruf fehlt (Zeile 16)
loop(pstruct,x);
-
Achso bitte mit ZeroMemory vergessen, ist ja in der Windows.h deklariert also kein ansi c.
sorry
-
Hier nochmal:
typef struct __mystruct { char c1[255]; char c2[255]; char c3[255]; _mystruct *pnext; } _mystruct; void foo() { int x=5; __mystruct *pstruct=new __mystruct[x]; loop(pstruct,x); delete []_pstruct; } void loop(__mystruct *pstruct, int nlen) { __mystruct *tmp; tmp=pstruct; for (int x=0; x<nlen; x++) { //TODO.... tmp+=sizeof(*pstruct); //so? tmp+=sizeof(__mystruct); //oder so? } }
-
Bezeichner, die mit _ beginnen, darf man nicht selbst anlegen.
__mystruct *pstruct=new __mystruct[x]; ... delete []_pstruct;
Syntax-Fehler. Entweder malloc() und free() verwenden, oder eine Etage tiefer absteigen.
::ZeroMemory(pstruct,sizeof(__mystruct*)*x); //so? ::ZeroMemory(pstruct,sizeof(__mystruct)*x); //oder so?
ZeroMemory gibt's nicht. Wenn's das gäbe, wäre die zweite Variante besser, weil die erste statt der Grösse der Struktur die Grösse eines Zeigers auf die Struktur verwendet.
pstruct+=sizeof(*pstruct); //so? pstruct+=sizeof(__mystruct); //oder so?
Einfach
pstruct++
, der Compiler kümmert sich um die Grösse. Gerade das ist der Witz an den Zeigern.
-
Und schlau wäre es sicher, einen C-Compiler statt dem C++-Compiler zu verwenden, sonst verwirrst du dich auf Dauer sicher gewaltig.
-
Danke für die ausführliche Erklärung.
Auch wenn ich im falschen Forum gelandet bin, bitte ich noch um eine Antwort:
Ist einpstruct++;
identisch wie
pstruct+=sizeof(__mystruct*);
und wie
pstruct+=1;
Danke für deine Erklärungen!
-
halloforumsgast schrieb:
Danke für die ausführliche Erklärung.
Auch wenn ich im falschen Forum gelandet bin,Die C++ler würden dich hierher verweisen, weil du die bösen C-Arrays verwendest.
halloforumsgast schrieb:
bitte ich noch um eine Antwort:
Ist einpstruct++;
identisch wie
pstruct+=sizeof(__mystruct*);
und wie
pstruct+=1;
pstruct++
ist das gleiche wiepstruct += 1
, für alle Zeiger-Typen und alle Zahlen-Typen.In dem Fall ist pstruct ein Zeiger auf __mystruct, deshalb ist das auch das gleiche wie
(__mystruct*)((char*)pstruct + sizeof(__mystruct))
. Den Umweg über char* muss ich nehmen, weil das Erhöhen von pstruct von selbst um die Grösse der Struktur weiterspringt (sizeof(__mystruct)
ist gut 750), aber, wie gesagt, darum kümmert sich der Compiler.sizeof(__mystruct*)
ist wiederum nur ein paar Bytes, je nach Breite der Adressen auf deiner Architektur.
-
Halloforumsgast schrieb:
Achso bitte mit ZeroMemory vergessen, ist ja in der Windows.h deklariert also kein ansi c.
sorryStatt ZeroMemory() kannst du einfach man: memset verwenden und Nullen schreiben. Was anderes macht ZeroMemory() auch nicht.
-
PTR größe bei z.B. x86 und x64 systemen?
die Zeile hier klingt ja mal total übel!!(__mystruct*)((char*)pstruct + sizeof(__mystruct))
Oh man, oh man oh man.
also ich würde jetzt mal schätzen
sizeof(__mystruct) müsste eigentlich
3x char[255]=765 + 1x ptr 4byte= 769 Byte.
jetzt glaube ich ist es mir evtl. ein bischen klarer.
wenn ich sage:pstruct+=sizeof(__mystruct);
sage ich ja eigentlich
pstruct+=769;
Das wäre ja fatal!
ich müsste eigentlich sowas machenpstruct+=(sizeof(__mystruct*)/sizeof(__mystruct*));
oder einfach
pstruct++;
Man aber die Zeile von dir ist echt heavy....
(__mystruct*)((char*)pstruct + sizeof(__mystruct))(__mystruct*)((char*)Addresse+769);
(__mystruct*)((char*)erhöhte Address);
(__mystruct*)charauferhöhte Adresse;
__mystruct auferhöhte Adresse.
hmmmmmmm
strangeHeapDamage@brain.
-
Halloforumsgast schrieb:
sizeof(__mystruct) müsste eigentlich
3x char[255]=765 + 1x ptr 4byte= 769 Byte.Circa. Der Compiler darf auch noch Füllbytes in die Struktur geben, zB um jeden Member an einer Adresse zu haben, die durch 4 teilbar ist (viele 32-Bitter mögen das). Man kann das aber bei den meisten Compilern genau einstellen.
Sonst hast du mit allem recht.