Char-Array in C kopieren

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion memcpy, um ein Char-Array in C zu kopieren
  2. Verwenden der Funktion memmove zum Kopieren eines Char-Arrays in C
Char-Array in C kopieren

Dieser Artikel demonstriert mehrere Methoden, wie ein Char-Array in C kopiert werden kann.

Verwenden Sie die Funktion memcpy, um ein Char-Array in C zu kopieren

Char-Arrays sind wahrscheinlich die häufigste Datenstruktur, die im C-Code manipuliert wird, und das Kopieren des Array-Inhalts ist eine der Kernoperationen dafür. Strings im C-Stil sind den char-Arrays sehr ähnlich; daher gibt es mehrere Möglichkeiten, mit dem Kopieren des Array-Inhalts umzugehen. Im folgenden Beispiel haben wir zwei Arrays deklariert, arr und arr2; ersteres wird mit der Zeichenlisten-Notation und letzteres mit einem String-Literal initialisiert. Beachten Sie, dass dies zu unterschiedlichen Array-Strukturen und -Größen führt. Das Objekt arr hat 7 Zeichen im Speicher, aber arr2 nimmt 17 Zeichen plus abschließendes Null-Byte auf, was zu einem 18-Byte-Objekt führt. Folglich übergeben wir den Wert des Ausdrucks sizeof arr2 - 1 als zweites Argument, um die Länge des Arrays zu bezeichnen. Andererseits kann man den Inhalt des Arrays arr2 mit der Funktion printf und der Formatangabe %s ausgeben.

Die gleichen Details sollten beim Kopieren der char-Arrays an einen anderen Ort beachtet werden. Die Funktion memcpy ist Teil der Standardbibliothek der String-Utilities, die in der Header-Datei <string.h> definiert ist. Sie nimmt drei Parameter entgegen, von denen der erste der Zielzeiger ist, in den der Inhalt des Arrays kopiert wird. Der zweite Parameter ist der Zeiger auf das Quell-Array, und der letzte Parameter gibt die Anzahl der zu kopierenden Bytes an. Beachten Sie, dass der sizeof-Operator die Größe des char-Array-Objekts in Bytes zurückgibt. Also weisen wir den dynamischen Speicher mit dem Aufruf malloc zu und übergeben ihm den Wert des Ausdrucks sizeof arr. Der zurückgegebene Speicherbereich reicht aus, um den Inhalt von arr aufzunehmen, und wir müssen uns keine Sorgen über Pufferüberlauffehler machen. Beachten Sie jedoch, dass der von malloc zurückgegebene Zeiger wieder freigegeben werden sollte.

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

void printCharArray(char *arr, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  printf("%lu\n", sizeof arr);
  printf("%lu\n", sizeof arr2);

  printCharArray(arr, sizeof arr);
  printCharArray(arr2, sizeof arr2 - 1);

  char *str = malloc(sizeof arr);
  memcpy(str, arr, sizeof arr);
  printf("str: ");
  printCharArray(str, sizeof arr);
  free(str);

  str = malloc(sizeof arr2);
  memcpy(str, arr2, sizeof arr2);
  printf("str: %s\n", str);
  free(str);

  exit(EXIT_SUCCESS);
}

Ausgabe:

7
18
a, b, c, d, e, f, g,
a, r, r, a, y,  , i, n, i, t, i, a, l, i, z, e, d,
str: a, b, c, d, e, f, g,
str: array initialized

Verwenden der Funktion memmove zum Kopieren eines Char-Arrays in C

memmove ist eine weitere Funktion zum Kopieren von Speicherbereichen aus den String-Utilities der Standardbibliothek. Sie wurde als robustere Funktion implementiert, um den Fall zu berücksichtigen, dass sich Ziel- und Quellspeicherbereich überlappen. Die Parameter von memmove sind die gleichen wie bei memcpy.

Beim Kopieren des Inhalts von arr2 haben wir den Ausdruck sizeof arr2 als dritten Parameter übergeben. Das bedeutet, dass sogar das abschließende Null-Byte in den Zielzeiger kopiert wurde, aber wir nutzen diese Aktion konsequent aus, indem wir printf mit %s aufrufen, um den Inhalt auszugeben, anstatt printCharArray zu verwenden.

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

void printCharArray(char *arr, size_t len) {
  for (size_t i = 0; i < len; ++i) {
    printf("%c, ", arr[i]);
  }
  printf("\n");
}

int main(int argc, char *argv[]) {
  char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
  char arr2[] = "array initialized";

  char *str = malloc(sizeof arr);
  memmove(str, arr, sizeof arr);
  printf("str: ");
  printCharArray(str, sizeof arr);
  free(str);

  str = malloc(sizeof arr2);
  memmove(str, arr2, sizeof arr2);
  printf("str: %s\n", str);
  free(str);

  exit(EXIT_SUCCESS);
}

Ausgabe:

str: a, b, c, d, e, f, g,
str: array initialized
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