如果 strcpy() 函数的第二个参数中没有空字符,则会返回意外结果。为什么?

Without null char in second argument for strcpy() function is returning unexpected result. Why?

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

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

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

的字节

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

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

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

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

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

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

char b[2] = "12";

char b[] = "12";

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