为什么将字符串文字指定为结构体字符数组成员的值会产生错误?

Lor*_*ous 2 c structure

存在一个我定义如下的结构:

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

然而,在此特定实例中,声明该结构的对象并将字符串文字作为值分配给两个字符数组成员中的任何一个都会产生错误。当我通过以下方式赋值时,会出现错误:

int main()
{
    struct details d1;
    d1.name="Constantine";
    d1.country="Byzantium";
    exit(EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

我的 GCC C 编译器产生的错误如下:

错误:将“const char [12]”分配给“char [20]”时类型不兼容

发生这种情况是否是由于字符串文字是常量字符数组,而我声明为所述结构的组成部分的字符数组成员本质上不是常量?将上述结构成员声明为常量可以解决当前的错误吗?或者我是否采用不同的方法来将初始值加载到所述结构成员?

P__*_*J__ 5

在C语言中=不复制数组的上下文。字符串文字是一个const char数组。要复制数组,您需要迭代数组的所有元素。

char *copy_string(char *dest, const char *src)
{
    char *wrk = dest;
    while((*wrk++ = *src++)) {}
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

由于字符串操作在编程中非常常见,C 标准库提供了“开箱即用”的字符串操作函数( strcpystrlen等)strcmp

您只能在初始化对象时使用赋值。在初始化期间,字符串文字将被复制到数组中。

    struct details d1 = {.name="Constantine", .country="Byzantium"};
    char str[] = "Hello World";
    int arr[] = {0,1,2,3,4,5,6,7,8,9,10};
Run Code Online (Sandbox Code Playgroud)