C程序产生奇怪的输出
在学习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
#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个字符的数组。谢谢你的解释谢谢你的详细解释