C++ 从const char*转换为char*修改VC+中的数据+;
在VC++中,当我将C++ 从const char*转换为char*修改VC+中的数据+;,c++,visual-c++,g++,C++,Visual C++,G++,在VC++中,当我将std::string::c_str()返回的const char*值强制转换为char*并打印转换后的值时,屏幕上不会打印任何内容。下面是代码片段 #include "stdafx.h" #include <string> using namespace std; string test() { return(string("HELLO"));} int _tmain(int argc, _TCHAR* argv[]) { char* val;
std::string::c_str()
返回的const char*
值强制转换为char*
并打印转换后的值时,屏幕上不会打印任何内容。下面是代码片段
#include "stdafx.h"
#include <string>
using namespace std;
string test() { return(string("HELLO"));}
int _tmain(int argc, _TCHAR* argv[])
{
char* val;
val = (char*) test().c_str();
printf("\n %s\n", val);
return 0;
}
#包括“stdafx.h”
#包括
使用名称空间std;
string test(){return(string(“HELLO”);}
int _tmain(int argc,_TCHAR*argv[]
{
char*val;
val=(char*)test().c_str();
printf(“\n%s\n”,val);
返回0;
}
当我简单地检查val[0]
处的ASCII值时,它是0。但是在G++下,文本HELLO
会显示出来
从const char*到char*的转换是否为非标准转换,其结果未定义 您得到的是未定义的行为,因为
test()
返回的临时行为会立即被销毁。演员与此无关
要消除此问题,请将test()
返回的值指定给局部变量。现在它将通过调用printf
继续存在
int _tmain(int argc, _TCHAR* argv[])
{
string temp;
char* val;
temp = test();
val = (char*) temp.c_str();
printf("\n %s\n", val);
return 0;
}
只要在更改字符串后不修改值或不从中读取值(但至少应该得到一条警告),转换就可以了
问题在于,您在临时调用函数(临时是由
cat()
返回的string
)。在之后代码>,临时文件超出范围,val
仍然指向由临时文件管理的内存。它是UB从中读取的。请注意,如果不使用强制转换,您会得到类似的行为(将val
的类型更改为char const*
):
如其他答案中所述,此特定示例中的问题不是强制转换,而是由c_str()
返回的指针指向的数据的生存期。当从dies中获取该数据的对象(在本例中,该对象位于行末尾的分号处,因为它是由test()
函数返回的临时对象)时,该数据无效
请注意,正如chris在一篇评论中指出的那样,即使指针是从寿命较长的对象上的c_str()
调用中获得的,数据也可能由于其他原因变得无效(基本上是在字符串对象被修改的情况下)。从cat
返回的字符串在表达式末尾被销毁,留下一个悬空的指针,不是吗?这与stringstream的问题相同:val=sstream.str().c_str()代码>太棒了!我完全没有抓住这一点。非常感谢。只要不修改值,我就不会这么说。在字符串对象上调用非常量函数也会使其无效,尽管这在这里是不可能的,但知道该指针可以使用多长时间是很重要的。只是我觉得值得一提的事情。
char const* val;
val = test().c_str();
printf("\n %s\n", val);