Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在RHEL linux中,使用std::string变量赋值为&引用;(空字符串值)正在提供垃圾值_C++_Linux - Fatal编程技术网

C++ 在RHEL linux中,使用std::string变量赋值为&引用;(空字符串值)正在提供垃圾值

C++ 在RHEL linux中,使用std::string变量赋值为&引用;(空字符串值)正在提供垃圾值,c++,linux,C++,Linux,在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,

在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;
}
结果是 Str=7 Str=8

其中没有赋值给str变量

我们在网上查了很多地方。 我希望有人能帮助我解决这个问题


相同的代码在RHEL Linux的旧版本中工作。

写入
std::string::c_str()
返回的指针是非法的。明确指出这会导致未定义的行为。此指针最初的类型为
const char*
,专门用于表示此限制

关于程序显示的结果,我想这两个字符串都指向同一个空字符串缓冲区(一些内部
const char empty[]=”
),因此写入一个字符串会导致更改所有空字符串的值

如果确实需要使用
sprintf
而不是
std::stringstream
,则可以使用字符向量而不是字符串:

std::vector<char> buf(10);
sprintf(buf.data(), "%d" ,7);
std::string result = buf.data();
std::向量buf(10);
sprintf(buf.data(),“%d”,7);
std::string result=buf.data();

您正在处理内部字符串指针,因此会遇到未定义的行为

一个STD::String对象是C++字符串对象。创建这样一个对象(str),然后创建第二个对象(strTemp),从第二个对象中获取常量char*,然后尝试将整数写入该char数组。当然,编译器知道这是错误的(const),并会抱怨:

从常量字符*到字符的转换无效*

因此,通过抛出常量,您可以强制忽略此错误。 现在,在强制忽略错误之后,意外的事情发生了

这与平台无关,至少在总体上是这样。由于这是未定义的行为,症状可能会因您使用的平台而异。我认为两个字符串对象(都是空的)共享相同的内存位置(至少只要它们相同)(在使用的平台上),因此覆盖第二个字符串返回的指针后面的内存也会影响第一个字符串对象。如果为字符串指定不同的值,-当然这仍然是错误的

阅读C++/C(C++对象、C指针和常量的含义),特别是

编辑

op似乎专注于平台,因此我将在这里重复显而易见的内容。写入变量a(strTemp)的常量表示,然后期望数据在变量b(str)中是假的。您正在覆盖您不拥有的内存,简而言之,您正在覆盖另一个变量(str)的内部内存。在某些情况下,这些数据恰好以另一个变量结束。这完全被打破了。
我真的希望这只是一个测试程序或什么的-而不是一个生产性的应用程序

不要像那样混合使用C/C++语言。在C++中,仍然可以创建一个char(足够大),并使用像StestFF()这样的函数,期望这样的C字符串写入它——如果有一个很好的理由。否则,只需编写适当的C++。 例如,如果将int转换成C++字符串是你的实际问题,这里有一个例子:

#include <iostream>
#include <sstream>

//...
std::string str;
int number = 7;
ostringstream oss;
oss << number;
str = oss.str();
#包括
#包括
//...
std::字符串str;
整数=7;
ostringstream oss;

oss您不能写入
strTemp.c_str()
并期望有定义良好的行为。对
(char*)
的强制转换是对
const
的强制转换,这应该会提示您正在冒险进行未定义的行为。在第一个示例中,您所说的“给予垃圾值”是什么意思?您可能得到的意外输出是什么?我希望str值应该是空字符串。但在第二个例子中,它给出了7。第一个例子中的一些垃圾号。第一个例子应该给出空的输出。其他的都是bug。不过,我无法重现你观察到的结果。此程序是否显示您在机器上看到的行为?它在windows中工作。@msk“正在工作”?它没有明确的工作方式。根据语言标准,您的代码未定义。你真的应该解决这个问题:)看,我的观点是不要使用sprint。当我改变变量strTemp时,变量str也在改变。有什么解决办法吗。@msk:是的,程序似乎正在运行;这就是“未定义”的含义。但是,windows版本中存在危险的缓冲区溢出(字符串的工作方式不同),将来可能随时崩溃。@msk有几种方法可以修改字符串,例如,通过索引运算符(
[]
),通过外部缓冲区(参见我的vector示例)。只是不要使用c_str,因为它是只读的。msk:忽略所有这一切仍然是错误的(使用sprintf()写入内部字符串指针后面的内存?),我认为通过“works”,您可能指的是这样一个事实(至少在您的系统上),修改第二个字符串后面的内存也会影响第一个字符串?这可能是由于std::string的实现。但是,如果代码的其余部分做了类似的坏事,那么std::string的实现应该是最不需要担心的事情(无意冒犯)。请不要认为这是我们第一次使用Linux。同样的代码也在RHEL Linux.msk的旧版本中工作,我不知道为什么您不断重复,未定义的行为无法“工作”(根据定义),无论您多么频繁地说。如果您认为您的问题尚未得到回答,请重新措辞。但除非你解释为什么你希望坏代码能工作,否则我帮不了你。