große Strukturen mit Null füllen.



  • Gibt es einen Befehl, der in Struckturen alle internen Variablen auf NULL setzt.





  • also würde memset(pointer Strucktur,NULL,sizeof(pointer Struktur)) das mache? Sehe ich das richtig?



  • Nightstorm schrieb:

    also würde memset(pointer Strucktur,NULL,sizeof(pointer Struktur)) das mache? Sehe ich das richtig?

    fast richtig 😉
    -> memset(pointerStruktur,NULL,sizeof(Struktur)) <-



  • klar natürlich sizeof(Strucktur), mmache ich ja auch beim Malloc.. 😉

    Nochmal dnke für die schnelle Hilfe



  • wobei ich meine mal gelesen zu haben, das sei nicht wirklich standardkonform, da z.B. NULL-Zeiger nicht auf jeder Architektur auch wirklich nur mit 0-Bytes repräsentiert werden.



  • DrGreenthumb schrieb:

    wobei ich meine mal gelesen zu haben, das sei nicht wirklich standardkonform, da z.B. NULL-Zeiger nicht auf jeder Architektur auch wirklich nur mit 0-Bytes repräsentiert werden.

    hast recht.
    ich würde auch lieber 'ne richtig '0' nehmen anstatt NULL



  • warum nicht SecureZeroMemory ?



  • Das währe meine nächste Frage gewesen, den bei c und NULL mault das Eclipse rum. Das die NULL nicht geht. Wenn ich jetzt 0 eintrage, kann ich dann auf NULL testen? sonst muss ich noch eine Menge Code umbauen.

    PS. zu schnell,
    also was ist secureZeroMemory? geht das in C, und was muss ich einbinde?



  • usbm_io_t *usbm_io;
    
    usbm_io = malloc(sizeof(usbm_io_t));
    memset(usbm_io,0,sizeof(usbm_io_t));
    

    funktioniert nicht, auch wenn ich <string.h> includiere, sagt mir mein Eclipse das das so nicht funktioniert.

    Die Strucktur sieht so aus:

    struct usbm_io_t {
       usbm_io_t *next, *prev;
       usbi_io_t *io;
       int timeout;
       int submit_time;
       struct {
         usbm_callback_type_t type;
         void *arg;
         union {
           libusb_ctrl_callback_t control;
           libusb_intr_callback_t interrupt;
           libusb_bulk_callback_t bulk;
           libusb_isoc_callback_t isochronous;
         } function;
       } callback;
       union {
         struct libusb_contr_request control;
         struct libusb_intr_request interrupt;
         struct libusb_bulk_request bulk;
         struct libusb_isoc_request isochronous;
       } request;
    };
    

    habt ihr eine Ahnung was da falsch läuft?



  • Wie schaut denn die Fehlermeldung aus?



  • Nightstorm schrieb:

    ...sagt mir mein Eclipse das das so nicht funktioniert.

    ist doch egal was eclipse dazu sagt. der compiler muss das schlucken...



  • noch nicht compiliert, weil zu viel Code, der noch nicht fertig ist. 🤡



  • net schrieb:

    DrGreenthumb schrieb:

    wobei ich meine mal gelesen zu haben, das sei nicht wirklich standardkonform, da z.B. NULL-Zeiger nicht auf jeder Architektur auch wirklich nur mit 0-Bytes repräsentiert werden.

    hast recht.
    ich würde auch lieber 'ne richtig '0' nehmen anstatt NULL

    naja, das ändert aber nichts. Ich bezog mich auf die Tatsache das void* p = 0 zwar legal ist, aber memset(&p, 0, sizeof(void*)) nicht. Eben weil ein 4-Byte großer Zeiger nicht zwingend aus 4 0-Bytes bestehen muss.

    Aber abgesehen davon, dass ich mir da jetzt nichtmal so sicher bin, gibts das in der Realität wohl eh nicht 😉



  • DrGreenthumb schrieb:

    naja, das ändert aber nichts. Ich bezog mich auf die Tatsache das void* p = 0 zwar legal ist, aber memset(&p, 0, sizeof(void*)) nicht. Eben weil ein 4-Byte großer Zeiger nicht zwingend aus 4 0-Bytes bestehen muss.

    klar, bei sowas geht 'memset' immer schief und man muss die pointer wohl einzeln auf 'NULL' setzen...



  • Bei sowas würde sich dann eine Art Referenz-Struktur anbieten, die man dann via memcpy() auf die zu initialisierenden Strukturen kopiert. Wenn man halt ultraportabel sein will 😉



  • ich wollte mir eigentlich nur sparen in alle Variablen der Struktur einzel die NULL einzusetzten. Das ist nur unötige Coderei. Kommt aber pro Struktur nur einmal vor, nähmlich bei der ersten, weil mein Programm diese als erste in einer verketteten Liste braucht.



  • Kannst es ja auch so machen:

    usbm_io_t *usbm_io;
    usbm_io_t tmp = {};
    usbm_io = malloc(sizeof(usbm_io_t));
    *usbm_io = tmp;
    


  • das geht? dann setz er alles in der Strucktur auf Null? währe schon mal super!



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply