Verwendung der Funktion bzero in C
-
Verwenden Sie die Funktion
bzero
, um den Speicherbereich in C zu löschen -
Verwendung von die Funktion
explicit_bzero
zum Löschen des Speicherbereichs in C -
Verwenden Sie die Funktion
memset
, um den Speicherbereich in C zu löschen
Dieser Artikel demonstriert mehrere Methoden zur Verwendung der bzero
-Funktion in C.
Verwenden Sie die Funktion bzero
, um den Speicherbereich in C zu löschen
Die Speicherverwaltung ist eine der Kernaufgaben der C-Programmierung, da der Benutzer mit den grundlegenden Speicherstrukturen interagieren und auf ihnen operieren muss. Daher ist das Löschen der Speicherregion eine übliche Operation, die in vielen Szenarien verwendet wird. Manchmal soll dynamischer Speicher mit Nullen überschrieben werden, um ihn von Garbage-Werten zu befreien. Manchmal gibt es struct
, die mehrere Bit-Masken-Werte enthalten, die vor der Initialisierung ihrer Mitglieder explizit mit Nullen überschrieben werden müssen. In diesem Beispiel demonstrieren wir den Code, der die Socket-Adressstruktur, die später zum Binden an den angegebenen Socket verwendet wird, auf Null setzt. Die Funktion bzero
kann verwendet werden, um den angegebenen Speicherbereich mit null Bytes (\0
) zu löschen. Sie nimmt zwei Argumente entgegen, die Startadresse des Speicherbereichs und die Anzahl der Bytes, die mit Null gelöscht werden sollen.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"
const char *SOCKNAME = "/tmp/mysocket";
int main(int argc, char *argv[]) {
int sfd;
struct sockaddr_un addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
bzero(&addr, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (close(sfd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
Verwendung von die Funktion explicit_bzero
zum Löschen des Speicherbereichs in C
Eine andere Methode, den Speicherbereich mit Nullen zu überschreiben, ist die Verwendung der Funktion explicit_bzero
. Im Gegensatz zur Funktion bzero
garantiert explicit_bzero
, dass der Speicherbereich auch dann überschrieben wird, wenn Compiler-Optimierungen ableiten, dass die Funktion unnötig
ist. Beachten Sie, dass diese Funktion eine Nicht-Standard-Erweiterung der Sprache C ist und in einigen Compilern möglicherweise nicht enthalten ist.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"
const char *SOCKNAME = "/tmp/mysocket";
int main(int argc, char *argv[]) {
int sfd;
struct sockaddr_un addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
explicit_bzero(&addr, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (close(sfd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
Verwenden Sie die Funktion memset
, um den Speicherbereich in C zu löschen
memset
ist Teil der Standard-C-Bibliothek und auch die empfohlene Methode für die meisten Szenarien zwischen diesen drei Funktionen. bzero
ist eine veraltete Funktion und sollte in modernen Codebasen nicht verwendet werden. Allerdings kann die memset
-Operation vom Compiler im Gegensatz zu explicit_bzero
optimiert werden.
memset
nimmt drei Argumente entgegen:
- Die Speicheradresse.
- Das konstante Byte, mit dem der Speicher gefüllt werden soll.
- Die Anzahl der zu überschreibenden Bytes.
memset
gibt einen Zeiger auf den Speicherbereich zurück und kann in verketteten Funktionsaufrufen verwendet werden.
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"
const char *SOCKNAME = "/tmp/mysocket4";
int main(int argc, char *argv[]) {
int sfd;
struct sockaddr_un addr;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
memset(&addr, 0, sizeof(struct sockaddr_un));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (close(sfd) == -1) {
perror("close");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook