C-struct-Initialisierung mit char-array
Ich habe ein C struct wie folgt definiert:
struct Guest {
int age;
char name[20];
};
Als ich ein Guest
variable und initialisiert Sie mit dem folgenden:
int guest_age = 30;
char guest_name[20] = "Mike";
struct Guest mike = {guest_age, guest_name};
Bekam ich die Fehlermeldung über den zweiten parameter Initialisierung der sagt mir, dass guest_name
kann nicht verwendet werden, zu initialisieren Membervariablen char name[20]
.
Konnte ich diesen initialisieren alle:
struct Guest mike = {guest_age, "Mike"};
Aber das ist nicht was ich will. Ich will die Initialisierung aller Felder von Variablen. Wie dies in C?
- Sie können nicht kopieren von arrays. Verwenden
std::string
. - Ich weiß, dass ich verwenden können
std::string
. Aber was ist, wenn ich will-stick mit C-style char-arrays? - Sie sagte, C oder C++. Jetzt sagen Sie, C.
- Ich sollte klarstellen. Ich möchte es in C char-array. Bearbeitet haben, meine Frage. Ist es möglich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
mike.name
ist 20 bytes des reservierten Speichers innerhalb der struct.guest_name
ist ein Zeiger auf einen anderen Speicherbereich. Durch zuweisen wollenguest_name
auf die struct Mitglied Sie versuchen etwas Unmögliches.Wenn Sie zum kopieren von Daten in der Struktur, die Sie haben zu verwenden
memcpy
und Freunde. In diesem Fall müssen Sie behandeln die\0
terminator.Wenn Sie
\0
- terminierte " strings können Sie auchstrcpy
, aber da diename
's Größe ist 20, ich würde vorschlagenstrncpy
.Guest mike = {...}
. Ichmike.age = ...,; mike.id=...; memcpy(mike.name, guest_name, 20);
wenn ich mehr Felder haben.mike.der name ist ein Zeichen-array. Sie können nicht kopieren von arrays, indem Sie einfach mit dem = - operator.
Stattdessen müssen Sie verwenden
strncpy
oder etwas ähnliches, um die Daten zu kopieren.Haben Sie tagged diese Frage als C++, also würde ich gerne darauf hinweisen, dass es in diesem Fall sollten Sie verwenden fast immer
std::string
den Vorzug zuchar[]
.strncpy
im Allgemeinen.struct
mit der Klammer-notation, die Nullen alles Vergangenheit das angegebene Element. Es war eine Verwandte off-by-one Fehler in der strncpy nennen, jedoch, sowie einige Tippfehler, die ich bin überrascht, dass niemand harped auf. 😉 dankeKönnen Sie die statische Zuordnung einer Struktur mit einem festen char [] - array in C Zum Beispiel, gcc erlaubt die folgenden:
Und es tut das richtige (aber Vorsicht, sizeof(x): es gibt 4 auf meinem Rechner; nicht die Länge der gesamten statisch zugewiesenen Speicher).
Dies funktioniert nicht bei Strukturen zugeordnet, die in den Stapel, als Sie vielleicht vermuten.
sizeof("hello")
— aber vielleicht sind Sie bezogen aufsizeof(x)
, in dem Fall4
ist die richtige Antwort. (2) Dies wird als ein flexibles array-Element in einer Struktur. (3) Die Initialisierung ist eine GCC-Erweiterung, obwohl Sie zum aufrufen-pedantic
um es zu 'fess bis:initialization of a flexible array member [-Werror=pedantic]
beistatic test x={.num=sizeof("hello"),.str="hello"};
— compiler-Optionengcc -O3 -g -std=c11 -Wall -Wextra -Werror -pedantic xx37.c
. Ich bin mit GCC-6.1.0-on-Mac-OS-X-10.11.6.size xx37.o
(woxx37.c
enthält eine Kopie des Codes in dieser Antwort) gibt einen data-Abschnitt-Größe 10, das entspricht der Größe, diex
sein sollte, wenn es zugewiesen wurde als eine Einheit (das ist, wie eine FAM, die gelöst werden müssen). So, ich folgern, dass der GCC macht den job richtig (keine große überraschung gegeben, dass Sie es tut), aber ich bin bereit zu zeigen, dass ich bin falsch auf diesem.