Char-Array in C kopieren
-
Verwenden Sie die Funktion
memcpy
, um ein Char-Array in C zu kopieren -
Verwenden der Funktion
memmove
zum Kopieren eines Char-Arrays in C
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
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