我有一个数字,需要将其转换为const char * (我正在使用的API需要const char *作为它的许多函数的输入)。以下工作:
int num = 5;
std::string s = std::to_string(5);
const char * p = s.c_str();正如类似于?中的答案所建议的,但它涉及创建看似不必要的变量s,因此我尝试了以下操作,但它不起作用(p指向后面的空字符串):
int num = 5;
const char * p = std::to_string(num).c_str();我有办法做到这一点吗?为什么第二个例子不起作用?如果我犯了这个明显的错误,这种行为非常类似于发生了什么:
const char * p;
{
std::string tempStr( "hi" );
p = tempStr.c_str( );
// p points to "hi" string.
}
// now p points to "" string.这使我怀疑,std::to_string(num)问题立即超出了范围或类似的范围,因为它不用于直接初始化任何内容。
发布于 2017-09-23 04:38:51
std::string封装了动态内存管理(用new[]和delete[]创建)。让我们把它拆开。
const char * p = std::to_string(num).c_str();std::string (具有人类可读的num表示)。new[]ly分配给字符串的const char*。p。std::string→delete[]分配的const char*。p指向..。解除分配的数据如果使用指针,则指针指向的数据必须在该指针的整个生命周期内存在。
因此,不,除了new[]作为字符串的副本之外,没有其他办法,稍后您必须显式地对字符串进行delete[]。在这一点上,你已经把婴儿和浴缸一起扔了出去,没有必要使用std::string。
创建一个字符串,只要您想要引用它的内部数据,该字符串就至少存在。
发布于 2017-09-23 04:43:14
只需使用std::string,它可以完成您想做的一切,如果不使用它,则需要手动执行的所有操作。
当您需要将const char*传递给const char*函数时,只需使用std::string::c_str(),如下所示:
some_api_function(mystring.c_str()); // passes a const char*发布于 2017-09-23 04:37:55
您需要的是一个函数,它返回一个保存您的值并可用于管理其生存期的char*。有问题的版本被破坏了,因为char*指向它不管理的内存。
例如:
std::unique_ptr<char[]> str(int32_t x)
{
std::unique_ptr<char[]> res(new char[12]);
snprintf(res.get(), 12, "%d", x);
return res;
}https://stackoverflow.com/questions/46376043
复制相似问题