将stcat :: string上的strcat转换为char *

时间:2019-01-23 18:45:56

标签: c++

我在我们的代码库中发现了这段(简化的)代码,这让我感到不愉快。它要么起作用,要么不起作用,或者从不被调用。我希望缓冲区会溢出,但是当我在在线编译器中尝试它时,它肯定不会起作用,但也不会溢出。我正在查看strcat的定义,它将从其空终止符开始将源写入目标,但是在这种情况下,我假设目标缓冲区(作为std::string创建)应该太小。.

#include <iostream>
#include "string.h"

using namespace std;

void addtostring(char* str){
    char str2[12] = "goodbye";
    strcat(str, str2);
}

int main()
{
    std::string my_string = "hello";
    addtostring((char*)my_string.c_str());

    cout << my_string << endl;

    return 0;
}

此操作的实际行为是什么?

1 个答案:

答案 0 :(得分:10)

  

此操作的实际行为是什么?

该行为是不确定的。首先,writing to any character through c_str is undefined behavior。其次,您是否使用data来获得char*overwriting the null terminator is also undefined behavior。最后,c_strdata都只给您一个指针(p),该指针的有效范围是[p, p + size()]中的元素。写入该范围之外的任何元素也是未定义的行为。

如果要修改字符串,则需要使用字符串的member / free函数来进行修改。您的函数可以重写为

void addtostring(std::string& str){
    str += "goodbye";
}

这将具有明确的行为。