strcat目标数组的大小

时间:2013-10-07 16:55:23

标签: c++ c strcat

采取以下计划:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char a[8] = "Hello, ";
    char b[7] = "world!";

    strcat(a, b);

    cout << a;

    return 0;
}

请注意,ab的大小与指定的字符串相同。

documentation表示要strcat(a, b)工作,a需要足够大才能包含连接的结果字符串。

然而,cout << a显示"Hello, world!"。我是否进入未定义的行为?

5 个答案:

答案 0 :(得分:11)

  

“我是否进入未定义的行为?”

是。已经写了[]末尾的区域。这次它起作用了,但可能属于别的东西。

这里我使用一个结构来控制内存布局,并演示它:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    struct S {
        char a[8];
        char b[5];
        char c[7];
    };

    S s;
    strcpy( s.a , "Hello, " );
    strcpy( s.b , "Foo!" );
    strcpy( s.c , "world!" );


    strcat(s.a, s.c);

    cout << s.a << endl;
    cout << s.b << endl;

    cin.get();

    return 0;
}

输出:

Hello, world!
orld!

而不是:

Hello, world!
Foo!

strcat()遍布b []。

请注意,在现实生活中的例子中,此类错误可能会更加微妙,并让您想知道为什么完美的无辜功能会在250行之后发生崩溃并且可怕地烧毁。 ; - )

编辑:我还建议您使用strcat_s吗?或者,更好的是,std :: strings:

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string a = "Hello, ";
    string b = "world!";
    a = a + b;
    cout << a;
}

答案 1 :(得分:3)

  

我是否进入未定义的行为?


如果文档说a需要足够大以包含连接的结果字符串”,为什么不简单地相信它?有什么疑问?

答案 2 :(得分:2)

在您的程序中,数组a不足以包含结果。因此,您的代码是错误的,应该修复。用标准的话说,你确实输入了未定义的行为,这意味着它可能有用或者可能不行......

答案 3 :(得分:2)

strcat做的就是锡上的内容。将b复制到a的末尾,而不关心已存在哪些数据。由于两个变量都在堆栈上,因此一个接一个地工作。但是试试

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    char a[8] = "Hello, ";
    int i =  10;
    char b[7] = "world!";

    strcat(a, b);

    cout << a << i;

return 0;
}

由于您的堆栈已被strcat

损坏,您可能会收到意外结果

答案 4 :(得分:1)

这是正确的......行为未定义。仅仅因为你得到了答案并不意味着它不会在下一次崩溃,因为数组a太小了。