Dynamisches Zuweisen eines Arrays in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion malloc, um ein Array dynamisch in C zuzuweisen
  2. Verwenden der Funktion realloc zum Ändern eines bereits allokierten Speicherbereichs in C
  3. Makro verwenden, um die Zuweisung für ein Array gegebener Objekte in C zu implementieren
Dynamisches Zuweisen eines Arrays in C

Dieser Artikel demonstriert mehrere Methoden, wie ein Array in C dynamisch zugewiesen werden kann.

Verwenden Sie die Funktion malloc, um ein Array dynamisch in C zuzuweisen

Die Funktion malloc ist die Kernfunktion für die Zuweisung des dynamischen Speichers auf dem Heap. Sie allokiert die angegebene Anzahl von Bytes und gibt den Zeiger auf den Speicherbereich zurück. Wenn man also ein Array bestimmter Objekttypen dynamisch allozieren will, sollte zunächst ein Zeiger auf den Typ deklariert werden. Anschließend sollte malloc aufgerufen werden, indem die Anzahl der Elemente multipliziert mit der Größe des einzelnen Objekts als Argument übergeben wird.

Im folgenden Beispiel wird der Speicher zum Speichern einer Zeichenkette allokiert. Wie vom Secure Coding Standard gefordert, wird errno auf 0 gesetzt, und der vom malloc-Aufruf zurückgegebene Zeiger wird überprüft, um die erfolgreiche Ausführung der Funktion zu verifizieren. Schließlich wird die Funktion memmove verwendet, um die Zeichenkette an den zugewiesenen Speicherplatz zu kopieren.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

const char *str = "random string to be moved";

int main() {
  char *arr = NULL;

  errno = 0;
  arr = malloc(SIZE * sizeof(char));
  if (!arr) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  memmove(arr, str, strlen(str));
  printf("arr: %s\n", arr);

  free(arr);
  exit(EXIT_SUCCESS);
}

Ausgabe:

arr: random string to be moved

Verwenden der Funktion realloc zum Ändern eines bereits allokierten Speicherbereichs in C

Die Funktion realloc wird verwendet, um die Größe des Speicherbereichs zu ändern, der zuvor durch den Aufruf von malloc zugewiesen wurde. Sie nimmt die ursprüngliche Speicheradresse und die neue Größe als zweites Argument an. Beachten Sie, dass realloc den gleichen Zeiger wie übergeben oder einen anderen zurückgeben kann, abhängig von der angeforderten Größe und dem verfügbaren Speicher nach der angegebenen Adresse. In der Zwischenzeit wird der Inhalt des vorherigen Arrays bis zur neu angegebenen Größe unverändert bleiben.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

const char *str = "random string to be moved";

int main() {
  char *arr = NULL;

  errno = 0;
  arr = malloc(SIZE);
  if (!arr) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  int num = 102;  // User Provided Value
  for (int i = 0; i < num; ++i) {
    if (i > SIZE) {
      arr = realloc(arr, 2 * SIZE);

      if (!arr) {
        perror("realloc");
        exit(EXIT_FAILURE);
      }
    }

    arr[i] = 'a';
  }

  free(arr);
  exit(EXIT_SUCCESS);
}

Makro verwenden, um die Zuweisung für ein Array gegebener Objekte in C zu implementieren

Normalerweise wird malloc verwendet, um ein Array aus einigen benutzerdefinierten Strukturen zuzuweisen. Da malloc den Zeiger void zurückgibt und implizit auf jeden anderen Typ gecastet werden kann, ist es eine bessere Praxis, den zurückgegebenen Zeiger explizit auf den entsprechenden Typ zu casten. Da es relativ einfach ist, Dinge zu übersehen und nicht die richtige Notation einzubeziehen, haben wir einen Makro-Ausdruck implementiert, der die Anzahl der Elemente im Array und den Objekttyp nimmt, um automatisch die richtige malloc-Anweisung zu konstruieren, einschließlich des richtigen Casts.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SIZE 100

typedef enum {
  Jan,
  Feb,
  MAR,
  APR,
  MAY,
  JUN,
  JUL,
  AUG,
  SEP,
  OCT,
  NOV,
  DEC
} month;

typedef struct {
  unsigned char dd;
  month mm;
  unsigned yy;
} date;

#define MALLOC_ARRAY(number, type) ((type *)malloc((number) * sizeof(type)))

int main() {
  date *d = NULL;

  errno = 0;
  d = MALLOC_ARRAY(SIZE, date);
  if (!d) {
    perror("malloc");
    exit(EXIT_FAILURE);
  }

  free(d);
  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 Array