使用char数组进行C struct初始化

ton*_*nga 12 c struct char

我有一个C结构定义如下:

struct Guest {
   int age;
   char name[20];
};
Run Code Online (Sandbox Code Playgroud)

当我创建一个Guest变量并使用以下内容对其进行初始化时:

int guest_age = 30;
char guest_name[20] = "Mike";
struct Guest mike = {guest_age, guest_name};
Run Code Online (Sandbox Code Playgroud)

我得到了关于第二个参数初始化的错误,它告诉我guest_name不能用于初始化成员变量char name[20].

我可以这样做来初始化所有:

struct Guest mike = {guest_age, "Mike"};
Run Code Online (Sandbox Code Playgroud)

但这不是我想要的.我想按变量初始化所有字段.如何在C中执行此操作?

Sco*_*tus 18

mike.name结构内部是20个字节的保留内存.guest_name是指向另一个内存位置的指针.通过尝试分配guest_name给struct的成员,你尝试了一些不可能的事情.

如果您必须将数据复制到您必须使用的结构memcpy和朋友.在这种情况下,您需要处理\0终结器.

memcpy(mike.name, guest_name, 20);
mike.name[19] = 0; // ensure termination
Run Code Online (Sandbox Code Playgroud)

如果你已经\0终止了字符串,你也可以使用strcpy,但是因为它name的大小是20,我建议strncpy.

strncpy(mike.name, guest_name, 19);
mike.name[19] = 0; // ensure termination
Run Code Online (Sandbox Code Playgroud)


Ste*_*ard 5

mike.name是一个字符数组.您不能只使用=运算符来复制数组.

相反,您需要使用strncpy或类似的东西来复制数据.

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

你已经将这个问题标记为C++,所以我想指出在这种情况下你应该几乎总是std::string优先使用char[].