我在我们的代码库中发现了这段(简化的)代码,这让我感到不愉快。它要么起作用,要么不起作用,或者从不被调用。我希望缓冲区会溢出,但是当我在在线编译器中尝试它时,它肯定不会起作用,但也不会溢出。我正在查看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;
}
此操作的实际行为是什么?
答案 0 :(得分:10)
此操作的实际行为是什么?
该行为是不确定的。首先,writing to any character through c_str
is undefined behavior。其次,您是否使用data
来获得char*
,overwriting the null terminator is also undefined behavior。最后,c_str
和data
都只给您一个指针(p
),该指针的有效范围是[p, p + size()]
中的元素。写入该范围之外的任何元素也是未定义的行为。
如果要修改字符串,则需要使用字符串的member / free函数来进行修改。您的函数可以重写为
void addtostring(std::string& str){
str += "goodbye";
}
这将具有明确的行为。