我的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中执行此操作?
答案 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;而不是静态分配内存的总长度。)
这对于从堆栈分配的结构不起作用,您可能会怀疑。