gpt4 book ai didi

c - strcat() 正在复制其第二个参数

转载 作者:行者123 更新时间:2023-11-30 20:14:39 25 4
gpt4 key购买 nike

自学C语言充满惊喜。我做这个简短的片段来测试 strcat() ,据说它将第二个参数附加到第一个参数:

#include <stdio.h>
#include <string.h>

char s1[4] = "Foo ";
char s2[] = "Bar";

int main(void) {

strcat(s1, s2);

printf("%s %d %d \n", s1, strlen(s1), strlen(s2));
return 0;
}

s1 以来,我预计会出现一些溢出错误是一个 4 个字符的数组,但我得到的是:

Foo BarBar BarBar 10 6

我在 Windows 上使用 MS Visual Studio Express 2013 执行此操作(顺便说一下,它会引发一些有关使用 strcat 的警报)。那么...为什么 strcat 会重复 s2 的值?这不在文档中。

最佳答案

这个

char s1[4] = "Foo ";

创建一个不带零终止符的字符序列s1。这意味着 s1 不是字符串,将其传递给 strcat 是非法的。该行为未定义。

(在上面的初始化声明中,您使用了 C 语言的一个不起眼的功能,它允许零终止符“脱离”正在初始化的 char 数组的末尾。在 C++ 中,这种初始化将是错误的,因为初始化字符串需要大小为 5 的缓冲区,而不是 4。)

实际上,这会导致 strcats1 数组的末尾运行并进入 s2(显然意外地位于内存附近)中寻找第一个参数中的零终止符。因此,最后您将 s2 添加到内存中 s1+s2 的组合中,这会产生 s2 被复制的效果。不用说,结果毫无意义。

当然,即使 s1 的大小为 5,代码仍然会表现出未定义的行为,因为目标缓冲区中没有空间用于连接结果。 s1 的大小必须至少为 8,结果才能适合其中。

关于c - strcat() 正在复制其第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25569605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com