Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++ 从const char*转换为char*修改VC+中的数据+;_C++_Visual C++_G++ - Fatal编程技术网

C++ 从const char*转换为char*修改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;

在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;
  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);