21 Stimmen

C Strukturinitialisierung mit einem char-Array

Ich habe eine C-Struktur wie folgt definiert:

struct Gast {
   int alter;
   char name[20];
};

Als ich eine Gast Variable erstellte und initialisierte, erhielt ich den Fehler zur zweiten Parameterinitialisierung, der mir mitteilte, dass gast_name nicht verwendet werden kann, um das Elementvariablen char name[20] zu initialisieren.

Ich konnte dies tun, um alles zu initialisieren:

struct Gast mike = {gast_alter, "Mike"};

Aber das ist nicht das, was ich will. Ich möchte alle Felder mit Variablen initialisieren. Wie mache ich das in C?

30voto

Scolytus Punkte 15159

mike.name sind 20 Bytes reservierter Speicher innerhalb der Struktur. guest_name ist ein Zeiger auf einen anderen Speicherort. Wenn Sie versuchen, guest_name dem Element der Struktur zuzuweisen, versuchen Sie etwas Unmögliches.

Wenn Sie Daten in die Struktur kopieren müssen, müssen Sie memcpy und ähnliche Funktionen verwenden. In diesem Fall müssen Sie den \0 Terminator behandeln.

memcpy(mike.name, guest_name, 20);
mike.name[19] = 0; // sicherstellen, dass terminiert wird

Wenn Sie \0 terminierte Zeichenketten haben, können Sie auch strcpy verwenden, aber da die Größe von name 20 beträgt, würde ich strncpy empfehlen.

strncpy(mike.name, guest_name, 19);
mike.name[19] = 0; // sicherstellen, dass terminiert wird

6voto

Steve Howard Punkte 6279

Mike.name ist ein Zeichenfeld. Sie können Arrays nicht einfach mit dem =-Operator kopieren.

Stattdessen müssen Sie strncpy oder etwas Ähnliches verwenden, um die Daten zu kopieren.

int guest_age = 30;
char guest_name[20] = "Mike";
struct Guest mike = { guest_age };
strncpy(mike.name, guest_name, sizeof(mike.name) - 1);

Sie haben diese Frage als C++ gekennzeichnet, daher möchte ich darauf hinweisen, dass Sie in diesem Fall fast immer std::string anstelle von char[] verwenden sollten.

1voto

Andy Foster Punkte 1

Eigentlich können Sie diese Struktur statisch initialisieren:

struct Gast {
   int alter;
   char name[20];
};

Gast gast = { 30, {'M','i','k','e','\0'}};

Jedes Element des Arrays muss explizit festgelegt werden und dies kann nicht mit C-Strings erfolgen. Wenn die Struktur mit einem char* Namen definiert ist, dann können wir dies tun:

struct Gast {
   int alter;
   char* name;
};

Gast gast = { 30, "Mike"};

-2voto

Daniel Punkte 87

Sie können in C eine Struktur mit einem festen char[]-Array statisch zuweisen. Zum Beispiel erlaubt gcc Folgendes:

#include 

typedef struct {
    int num;
    char str[];
} test;

int main(void) {
    static test x={.num=sizeof("hello"),.str="hello"};

    printf("sizeof=%zu num=%d str=%s\n",sizeof(x),x.num,x.str);
    return 0;
}

Und es funktioniert (aber Vorsicht bei sizeof(x): Es gibt 4 auf meinem Rechner zurück; nicht die Länge des gesamten statisch zugewiesenen Speichers).

Dies funktioniert nicht für Strukturen, die vom Stapel allokiert sind, wie Sie vermuten könnten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X