C程序产生奇怪的输出

C程序产生奇怪的输出,c,arrays,unix,memory,struct,C,Arrays,Unix,Memory,Struct,在学习C的过程中,我决定创建一个结构,它给出了我在其中提供的鱼的大小,我的问题是为什么我要编写这段代码: #include <stdio.h> #include <string.h> struct fish { char catfish[9]; //reserve memory for 9 chars char goldfish[10]; //reserve memory for 10 chars char mac

在学习C的过程中,我决定创建一个结构,它给出了我在其中提供的鱼的大小,我的问题是为什么我要编写这段代码:

#include <stdio.h>
#include <string.h>

struct fish
    {
        char catfish[9]; //reserve memory for 9 chars
        char goldfish[10]; //reserve memory for 10 chars
        char mackrel;
        char oldfish;
    };

int main()
{
    struct fish typeof_fish;

    strcpy(typeof_fish.catfish, "Big Fish\n");
    strcpy(typeof_fish.goldfish, "Small Fish\n");
    printf("%s\n", typeof_fish.catfish);

    return 0;


}
#包括
#包括
结构鱼
{
char鲶鱼[9];//为9个字符保留内存
char金鱼[10];//为10个字符保留内存
查尔·麦克雷尔;
黄鳝;
};
int main()
{
鱼的结构类型;
strcpy(鱼的类型,鲶鱼,“大鱼”);
strcpy(鱼类、金鱼、小鱼的类型);
printf(“%s\n”,类型为_fish.catfish);
返回0;
}
产出“大鱼小鱼”

然而,当我重写最上面的代码并更改char鲶鱼[9];烤鲶鱼[10]:

#include <stdio.h>
#include <string.h>

struct fish
    {
        char catfish[10]; //reserve memory for 10 chars
        char goldfish[10]; //reserve memory for 10 chars
        char mackrel;
        char oldfish;
    };

int main()
{
    struct fish typeof_fish;

    strcpy(typeof_fish.catfish, "Big Fish\n");
    strcpy(typeof_fish.goldfish, "Small Fish\n");
    printf("%s\n", typeof_fish.catfish);

    return 0;


}
#包括
#包括
结构鱼
{
char鲶鱼[10];//为10个字符保留内存
char金鱼[10];//为10个字符保留内存
查尔·麦克雷尔;
黄鳝;
};
int main()
{
鱼的结构类型;
strcpy(鱼的类型,鲶鱼,“大鱼”);
strcpy(鱼类、金鱼、小鱼的类型);
printf(“%s\n”,类型为_fish.catfish);
返回0;
}
它生产“大鱼”


提前感谢您对这一令人费解的错误的回答

当您复制
大鱼时,您在
鲶鱼[9]
中没有为空终止符留出足够的空间。该字符串的长度为9个字符,这意味着您需要一个大小为10的缓冲区来存储空终止符


如果字符串未命中空终止符,则输出具有未定义的行为,因为程序无法知道字符串的结束位置。

执行第一次复制时,
strcpy()
总共复制10个字节(9个来自字符串本身加上终止符)。由于您在
catfish
中只分配了9个字节,因此终止符进入
goldfish
的第一个字节,当您复制第二个字符串时,该字节将被覆盖。因此,当您对
catfish
执行
printf()
时,它不会在
catfish
的末尾停止打印,而是一直打印,直到在
goldfish
的末尾找到终止符


在第二种情况下,您添加了足够的空间,使终止符不会被覆盖,因此当您打印时,它只会按预期打印
catfish
的内容。

您的数组溢出了<代码>“小鱼\n”
,例如,占据12个字符。它不适合10个字符的数组。谢谢你的解释谢谢你的详细解释