0
#include<stdio.h>
#include <string.h>
int main()
{
    char a[5];
    char b[2]="12";
    strcpy(a,b);
    printf("%s\n",a);
}

字符串b中没有空字符,这就是输出不符合预期的原因。
output : 12@
为什么只有这样的输出?

4

2 回答 2

1

您的程序具有未定义的行为。

您的数组b包含{ '1', '2' }. 正如您所说,数组中没有空字符——这意味着它不包含字符串。

strcpy的第二个参数必须是指向字符串的指针。你给了它一个char*不是指向字符串的指针的值。

在实践中,strcpy可能会继续从内存中复制字符b。该内存包含任意垃圾——甚至访问它的尝试也具有未定义的行为。

从某种意义上说,你很幸运得到了明显垃圾的输出。如果在内存中的数组后面恰好有一个空字符,并且如果您的程序没有在尝试访问它时崩溃,那么它可能只是 print 12,并且您可能不知道您的程序有错误。

如果你想更正你的程序,你可以改变

char b[2] = "12";

char b[] = "12";

编译器将计算出保存字符串需要多大b(包括所需的终止空字符)。

于 2018-10-25T03:12:18.947 回答
1

strcpy 一直复制,直到遇到空字符(值为 0x00 的字节)。它会复制路上遇到的任何东西。在您的情况下,数组 b 之后的内存恰好包含一个值为 0x40 的字节('@'),然后是一个值为 0x00 的字节。

于 2018-10-25T02:04:50.913 回答