C 中的 strcpy 和 sprintf

strcpy and sprintf in C

我正在尝试像这样设置一些字符串变量:

char thingA[7], thingB[7], thingC[7];
strcpy(thingA, "StringA");
strcpy(thingB, "StringB");
strcpy(thingC, "StringC");
printf("%s\n", thingA);
printf("%s\n", thingB);
printf("%s\n", thingC);

但不是这样输出:

StringA  
StringB  
StringC  

它的输出是这样的:

StringA StringB StringC  
StringB StringC  
StringC 

我用 sprintf 试过这个,但得到了相同的结果。 老实说,我不知道发生了什么,也不知道如何解决这个问题,而且我在网上找不到任何东西,因为由于某种原因,搜索这类东西很难。 那么基本上为什么它在 a 中存储字符串 b 和 c,在 b 中存储 c?

常见错误:您的声明短了一个字节。如果你数一下你的常量字符串中的字符,有7个,你需要space来终止'[=10=]',否则你会覆盖内存并得到未定义的bahvaior。

所以将它们声明为 [8],它将起作用。

代码的问题是您在 C 中的字符串以 null 结尾 ([=10=]),因此 StringA,尽管有 7 个可打印字符,但实际上需要 8 个字符来存储。这三个 char 数组在堆栈上背靠背,因此覆盖终止空字符将导致它们被连接起来。每个指向 char 数组的指针都从不同的偏移量开始,因此 thingBthingC 的较短字符串,但在所有情况下 printf 都会读取字符串,直到它在事情结束C.

请注意,这是一个典型的缓冲区溢出错误,您很幸运,在 thingC 之后的堆栈上有一个空值,否则 printf 将继续读取和打印内存的时间更长。