15

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

struct Guest {
   int age;
   char name[20];
};

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

int guest_age = 30;
char guest_name[20] = "Mike";
struct Guest mike = {guest_age, guest_name};

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

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

struct Guest mike = {guest_age, "Mike"};

但这不是我想要的。我想通过变量初始化所有字段。如何在 C 中做到这一点?

4

4 回答 4

25

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

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

memcpy(mike.name, guest_name, 20);
mike.name[19] = 0; // ensure termination

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

strncpy(mike.name, guest_name, 19);
mike.name[19] = 0; // ensure termination
于 2013-09-23T19:19:13.467 回答
6

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);

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

于 2013-09-23T19:20:03.593 回答
0

实际上你可以静态初始化这个结构:

struct Guest {
   int age;
   char name[20];
};

Guest guest = { 30, {'M','i','k','e','\0'}};

数组的每个元素都必须明确设置,而这不能使用 c-strings 来完成。如果结构是用 char* 名称定义的,那么我们可以这样做:

struct Guest {
   int age;
   char* name;
};

Guest guest = { 30, "Mike"};
于 2021-01-06T14:43:34.467 回答
-2

您可以在 C 中静态分配具有固定 char[] 数组的结构。例如,gcc 允许以下操作:

#include <stdio.h>

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;
}

它做了正确的事情(尽管要注意 sizeof(x):它在我的机器上返回 4;而不是静态分配的总内存的长度)。

正如您可能怀疑的那样,这不适用于从堆栈分配的结构。

于 2016-09-05T03:17:00.880 回答