结构数组复制在C中是如何工作的?

结构数组复制在C中是如何工作的?,c,arrays,structure,strcpy,C,Arrays,Structure,Strcpy,这是我想在C中运行的代码 #include<stdio.h> #include<string.h> main() { struct record { char name[2]; char letter; }; struct record student[10]; strcpy(student[0].name,"t");//copy "t" to first struct's name variable

这是我想在C中运行的代码

#include<stdio.h>
#include<string.h>
main()
{
    struct record {
        char name[2];
        char letter;
    };

    struct record student[10];
    strcpy(student[0].name,"t");//copy "t" to first struct's name variable
    strcpy(student[1].name,"ri");//copy "ri" to second struct's name variable
    student[0].letter='a';//copy "a" to first struct's letter variable
    student[1].letter='b';//copy "b" to second struct's letter variable
    printf("%s %s %c %c", student[0].name, student[1].name, student[0].letter, student[1].letter);
}
#包括
#包括
main()
{
结构记录{
字符名[2];
字符字母;
};
结构记录学生[10];
strcpy(student[0]。name,“t”);//将“t”复制到第一个结构的name变量
strcpy(student[1]。name,“ri”);//将“ri”复制到第二个结构的name变量中
student[0]。letter='a';//将“a”复制到第一个结构的letter变量
student[1]。letter='b';//将“b”复制到第二个结构的letter变量
printf(“%s%s%c%c”,学生[0]。姓名,学生[1]。姓名,学生[0]。字母,学生[1]。字母);
}
我期望的输出是:triab

然而我得到的是:t肋骨a b

我做错了什么

strcpy(学生姓名,“ri”)//将“ri”复制到第二个结构的名称 变数

这绝对是错误的<代码>“ri”实际上是三个字符,因为也是空终止符。所以您要将三个字节复制到一个有两个字节的数组中,从而调用这个

strcpy(学生姓名,“ri”)//将“ri”复制到第二个结构的名称 变数


这绝对是错误的<代码>“ri”实际上是三个字符,因为也是空终止符。因此,您正在将三个字节复制到一个有两个字节的数组中,从而调用它。

在您的代码中,
name
是一个有两个
char
s的数组。OTOH,
“ri”
的大小是三个字符,包括空终止符

所以说

  strcpy(student[1].name,"ri");
你的内存太多了。这引起了人们的注意

[…]字符串不能重叠,目标字符串
dest
必须足够大才能接收副本。[…]如果
strcpy()
的目标字符串不够大,则可能发生任何情况

一旦点击UB,程序行为就无法被证明是正当的

要能够保持“ri”,您需要更改

char name[2];


在代码中,
name
是一个包含两个
char
s的数组。OTOH,
“ri”
的大小是三个字符,包括空终止符

所以说

  strcpy(student[1].name,"ri");
你的内存太多了。这引起了人们的注意

[…]字符串不能重叠,目标字符串
dest
必须足够大才能接收副本。[…]如果
strcpy()
的目标字符串不够大,则可能发生任何情况

一旦点击UB,程序行为就无法被证明是正当的

要能够保持“ri”,您需要更改

char name[2];

#包括
#包括
main()
{
结构记录{
字符名[3];
字符字母;
};
结构记录学生[10];
strcpy(student[0]。name,“t”);//将“t”复制到第一个结构的name变量
strcpy(student[1]。name,“ri”);//将“ri”复制到第二个结构的name变量中
student[0]。letter='a';//将“a”复制到第一个结构的letter变量
student[1]。letter='b';//将“b”复制到第二个结构的letter变量
printf(“%s%s%c%c”,学生[0]。姓名,学生[1]。姓名,学生[0]。字母,学生[1]。字母);
}
#包括
#包括
main()
{
结构记录{
字符名[3];
字符字母;
};
结构记录学生[10];
strcpy(student[0]。name,“t”);//将“t”复制到第一个结构的name变量
strcpy(student[1]。name,“ri”);//将“ri”复制到第二个结构的name变量中
student[0]。letter='a';//将“a”复制到第一个结构的letter变量
student[1]。letter='b';//将“b”复制到第二个结构的letter变量
printf(“%s%s%c%c”,学生[0]。姓名,学生[1]。姓名,学生[0]。字母,学生[1]。字母);
}

那我该怎么办?我是否应该将结构中name变量的大小从name[2]增加到name[3]以便在这种情况下工作?@rohitkrishna094是的,如果增加到3,则在这种情况下工作。但也许你需要更大的阵列。这样做,它起作用了。非常感谢你的及时帮助。我知道空字符,但在编写代码时忘记了它。谢谢。那我能做什么呢?我是否应该将结构中name变量的大小从name[2]增加到name[3]以便在这种情况下工作?@rohitkrishna094是的,如果增加到3,则在这种情况下工作。但也许你需要更大的阵列。这样做,它起作用了。非常感谢你的及时帮助。我知道空字符,但在编写代码时忘记了它。谢谢