Verwendung der Funktion bzero in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion bzero, um den Speicherbereich in C zu löschen
  2. Verwendung von die Funktion explicit_bzero zum Löschen des Speicherbereichs in C
  3. Verwenden Sie die Funktion memset, um den Speicherbereich in C zu löschen
Verwendung der Funktion bzero in C

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);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C Memory