从const char *转换为char *修改VC ++中的数据

时间:2012-08-30 21:07:44

标签: c++ visual-c++ g++

在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 *的强制转换是非标准的,其结果未定义?

3 个答案:

答案 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()调用获得的,数据也可能由于其他原因而变得无效(基本上如果字符串对象被修改) )。