我正在尝试设置一些像这样的字符串变量:
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
尝试了这个,但得到的结果相同。
老实说,我不知道发生了什么,或者如何解决这个问题,我在网上找不到任何东西,因为由于某种原因搜索这类东西已经证明很难。
所以基本上为什么将字符串b和c存储在a中,c存储在b?
答案 0 :(得分:2)
通常的错误:你的声明只有一个字节。如果计算常量字符串中的字符数,则为7,并且您需要空格来终止'\0'
,否则您将覆盖内存并获取未定义的bahvaior。
因此将它们声明为[8]
,它会起作用。
答案 1 :(得分:1)
代码的问题在于C中的字符串是空终止的(\0
),所以StringA
尽管有7个可打印的字符,但实际上需要存储8个字符。三个char数组在堆栈上背靠背,因此覆盖终止空字符将导致它们被连接。每个指向char数组的指针都以不同的偏移量开始,因此thingB
和thingC
的字符串较短,但在所有情况下printf
都将读取字符串,直到它找到空字符后事情C的结尾。
请注意,这是一个经典的缓冲区溢出错误,你很幸运,在thingC之后堆栈上有一个null,否则printf将继续读取并打印更长的内存。