谁能告诉我为什么此代码在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运算符,则会再次具有未定义的行为,然后将指针传递给指针。

07-27 17:21