在VC ++中,当我将const char*
返回的std::string::c_str()
值转换为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;
}
当我只检查val[0]
处的ASCII值时,它是0.但在G ++下,文本HELLO
会显示。
从const char *到char *的强制转换是非标准的,其结果未定义?
答案 0 :(得分:7)
只要您在修改字符串后不修改值或从中读取值,就可以使用强制转换(但您应该至少警告)。
问题是你在临时函数上调用该函数(临时函数是string
返回的cat()
)。在;
之后,临时超出范围,val
仍指向由temp管理的内存。这是UB的读物。
答案 1 :(得分:3)
您将获得未定义的行为,因为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;
}
答案 2 :(得分:0)
请注意,如果没有强制转换,您会获得类似的行为(将val
的类型更改为char const*
):
char const* val;
val = test().c_str();
printf("\n %s\n", val);
如其他答案中所述,此特定示例中的问题不是转换,而是由c_str()
返回的指针指向的数据的生存期。当从die中获取对象时,该数据无效(在这种情况下,由于它是test()
函数返回的临时对象,因此在行的末尾处是分号)。
请注意,正如chris在注释中指出的那样,即使指针是从对长寿命对象的c_str()
调用获得的,数据也可能由于其他原因而变得无效(基本上如果字符串对象被修改) )。