Technische Funktion von memset
-
Moin!
Zur Zeit befasse ich mich mit Socketprogrammierung in C und bin beim lesen der Man-Pages für die einzelnen socket-relevanten Funktionen auf den Gebrauch von memset zur Initialisierung des Speicherplatzes von Structs gestoßen.
Am Beispiel des struct addrinfo für die Funktion getaddrinfo:struct addrinfo hints, *servinfo; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; getaddrinfo(HOSTNAME, PORT, &hints, &servinfo);
Nach der Beschreibung wird memset mit:
"The C library function void *memset(void *str, int c, size_t n) copies the character c (an unsigned char) to the first n characters of the string pointed to by the argument str."
beschrieben.
Wie legt jedoch memset ein struct im Speicher an?
Kann ich das als einen zusammenhängenden Speicherblöck der Größe des structs bestehendend aus unsigned chars verstehen, wo ich auf die jeweiligen Unterblöcke (Elemente des Structs) zugreifen und beschreiben kann?Technisch erscheint mir memset tiefer als malloc angesiedelt zu sein, nun würde ich gerne einfach besser verstehen, wie die Verwendung dessen auf Strukturen aussieht, da in der Beispieldefiniton von memset nur normale char-Arrays verwendet werden.
Gruß und vielen Dank
-
Memset legt gar nichts an. Memset bekommt eine Adresse und eine Länge und befüllt den mit einem Wert.
Dem ist völlig egal was dahinter liegt. Egal ob Struktur, Buffer, oder sonstwas...
-
schreib einfach
struct addrinfo hints={0};
das setzt auch alle struct member auf 0.
-
Lässt sich somit pauschal sagen, memset kann mittels
struct addrinfo hints = {0};
ersetzt werden?
-
Nirvash schrieb:
Lässt sich somit pauschal sagen, memset kann mittels
struct addrinfo hints = {0};
ersetzt werden?
Nein. Damit initialisierst du ein bestimmtes Array mit 0. memset kann alles, jederzeit, auf jeden beliebigen Wert setzen.
-
Ok, vielen Dank.
-
Nirvash schrieb:
Lässt sich somit pauschal sagen, memset kann mittels
struct addrinfo hints = {0};
ersetzt werden?
wenn es dir lediglich darum geht, die struktur-member mit 0 zu initialisieren, dann ja. bei der obigen zeile übernimmt der compiler die initialisierung für dich.
in dem fall ist das ziemlich uncool memset zu benutzen.
-
SeppJ schrieb:
Nirvash schrieb:
Lässt sich somit pauschal sagen, memset kann mittels
struct addrinfo hints = {0};
ersetzt werden?
Nein. Damit initialisierst du ein bestimmtes Array mit 0. memset kann alles, jederzeit, auf jeden beliebigen Wert setzen.
jeden beliebigen wohl kaum
-
nullsett0r schrieb:
jeden beliebigen wohl kaum