在 RHEL Linux 中,使用分配有“”(空字符串值)的 std::string 变量会给出垃圾值
例如下面的代码
std::string str = "";
printf("%s",str.c_str());
我还有一个代码示例
int main()
{
string str = "";
printf("Str = %s\n" ,str.c_str());
string strTemp;
char * pcTRMP = new char [10];
//sprintf(pcTRMP,"%d" ,7);
sprintf((char*)strTemp.c_str() ,"%d" ,7);
printf("Str = %s\n" ,str.c_str());
sprintf((char*)strTemp.c_str() ,"%d" ,8);
printf("Str = %s\n" ,str.c_str());
return 0;
}
结果是 强度=7 强度=8
其中没有对 str 变量进行赋值。
我们在互联网上查了很多地方。 我希望有人能帮助我解决这个问题。
相同的代码可以在旧版本的 RHEL Linux 中运行。
最佳答案
写入 std::string::c_str()
返回的指针是非法的。 documentation for std::string
明确表明这会导致未定义的行为。该指针最初的类型为 const char *
,专门表达此限制。
关于程序显示的结果,我猜这两个字符串都指向同一个空字符串缓冲区(一些内部 const char empty[] = ""
),因此写入一个字符串会导致更改所有空字符串的值。
如果你确实需要使用sprintf
而不是std::stringstream
,您可以使用字符 vector 代替字符串:
std::vector<char> buf(10);
sprintf(buf.data(), "%d" ,7);
std::string result = buf.data();
关于c++ - 在 RHEL Linux 中,使用分配有 ""(空字符串值)的 std::string 变量会给出垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26738462/