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 ein

    pstruct++;
    

    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 ein

    pstruct++;
    

    identisch wie

    pstruct+=sizeof(__mystruct*);
    

    und wie

    pstruct+=1;
    

    pstruct++ ist das gleiche wie pstruct += 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.
    sorry

    Statt 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 machen

    pstruct+=(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
    strange 😉

    HeapDamage@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.
    🙂


Anmelden zum Antworten