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

时间:2013-09-23 19:12:58

标签: c struct char

我的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 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分: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);

您已将此问题标记为C ++,因此我想指出,在这种情况下,您应该优先使用std::string而不是char[]

答案 2 :(得分: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"};

答案 3 :(得分:-1)

您可以在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;而不是静态分配内存的总长度。)

这对于从堆栈分配的结构不起作用,您可能会怀疑。