谁能告诉我为什么此代码在Windows中工作而不在Linux中编译?
#include <stdio.h>
main()
{
char myname[10];
printf("Please Enter your name:");
scanf("%s",&myname);
printf("Welcome %s\n",myname);
strcpy(myname,"DefaultName");
printf("so your name now is %s\n",myname);
}
我在Windows中使用Dev c ++进行编译。
我在Linux中使用gcc或g ++进行编译。
那怎么了?
谢谢!
最佳答案
您必须记住,C语言中的字符串实际上没有长度,因此它使用一个特殊字符来告知字符串的结尾,即所谓的“空”字符('\0'
)。
因此,如果您有一个包含十个字符的数组,则它只能容纳一个九个字符的字符串,因为终止符也必须有空格。
字符串"DefaultName"
是十二个字符,包括字符串终止符,当您将其复制到数组中时,您将写出超出数组限制的内容,从而导致undefined behavior。如果将数组的大小增加两个字符,则该字符串将适合,但仅适合11个或更少(不包括终止符)字符的字符串。
旁注:字符串文字"DefaultName"
实际上是指向十二个字符的常量数组的指针,其内容为"DefaultName\0"
。
另一个注意事项:数组会衰减到指向其第一个元素的指针,因此在将数组传递给函数时,不必在数组上使用address-of &
运算符。实际上,我认为在传递应该保存字符串的变量作为函数的参数时,使用address-of运算符是一个坏习惯。原因是,经常在用C进行编程时,您将处理指针而不是数组,并且如果错误地对指针使用了address-of运算符,则会再次具有未定义的行为,然后将指针传递给指针。