C++ 你能从字符串的c_str()const char*中安全地得到一个指向字符串的指针吗?
我有一个const char指针,我肯定它来自一个字符串。例如:C++ 你能从字符串的c_str()const char*中安全地得到一个指向字符串的指针吗?,c++,string,c-str,C++,String,C Str,我有一个const char指针,我肯定它来自一个字符串。例如: std::string myString = "Hello World!"; const char* myCstring = myString.c_str(); 在我的例子中,我知道myCstring来自一个字符串,但我不再有权访问该字符串(我从函数调用中收到const char*,并且我无法修改函数的参数列表) 既然我知道myCstring指向现有字符串的内容,那么有没有办法安全地访问源于它的父字符串的指针?例如,我可以做这样
std::string myString = "Hello World!";
const char* myCstring = myString.c_str();
在我的例子中,我知道myCstring来自一个字符串,但我不再有权访问该字符串(我从函数调用中收到const char*,并且我无法修改函数的参数列表)
既然我知道myCstring指向现有字符串的内容,那么有没有办法安全地访问源于它的父字符串的指针?例如,我可以做这样的事情吗
std::string* hackyStringPointer = myCstring - 6; //Along with whatever pointer casting stuff may be needed
我担心的是,可能无法保证字符串的内容存储在某些或所有平台上的连续内存中,等等
既然我知道myCstring指向现有字符串的内容,那么有没有办法安全地访问源于它的父字符串的指针
否,无法从指向属于std::string
的字符数据的const char*
指针获取有效的std::string*
指针
我从函数调用中收到了const char*,无法修改函数的参数列表
在这种情况下,您唯一的选择是,您可以将指向std::string
本身的指针作为实际的const char*
指针传递,但只有在调用您的函数的任何东西都不会以任何方式解释const char*
时,这才有效,例如:
void doSomething(void(*func)(常量字符*),常量字符*数据)
{
...
func(数据);
...
}
void myFunc(常量字符*myCstring)
{
std::string*hackyStringPointer=reinterpret_cast(myCstring);
...
}
...
std::string myString=“你好,世界!”;
doSomething(&myFunc,reinterpret_cast(&myString));
既然我知道myCstring指向现有字符串的内容,那么有没有办法安全地访问源于它的父字符串的指针
否,无法从指向属于std::string
的字符数据的const char*
指针获取有效的std::string*
指针
我从函数调用中收到了const char*,无法修改函数的参数列表
在这种情况下,您唯一的选择是,您可以将指向std::string
本身的指针作为实际的const char*
指针传递,但只有在调用您的函数的任何东西都不会以任何方式解释const char*
时,这才有效,例如:
void doSomething(void(*func)(常量字符*),常量字符*数据)
{
...
func(数据);
...
}
void myFunc(常量字符*myCstring)
{
std::string*hackyStringPointer=reinterpret_cast(myCstring);
...
}
...
std::string myString=“你好,世界!”;
doSomething(&myFunc,reinterpret_cast(&myString));
说
对修改对象的其他成员函数的进一步调用可能会使返回的指针无效
你说你从一个函数调用中得到了char*,这意味着你不知道在这段时间内字符串发生了什么,对吗?如果您知道原始字符串没有被更改或删除(例如,超出范围,因此被销毁),那么您仍然可以使用char*
但是,您的示例代码存在多个问题。您要执行以下操作:
std::string* hackyStringPointer = myCstring - 6;
但我想你的意思是
char* hackyStringPointer = myCstring;
首先,您不能将char*强制转换为字符串*,其次,您不想在char*开始之前转换。char*指向字符串的第一个字符,您可以使用它来访问一直到尾随0字符的字符。但是您不应该在第一个字符之前或结尾的0字符之后,因为您不知道该内存中有什么,或者它是否存在。说
对修改对象的其他成员函数的进一步调用可能会使返回的指针无效
你说你从一个函数调用中得到了char*,这意味着你不知道在这段时间内字符串发生了什么,对吗?如果您知道原始字符串没有被更改或删除(例如,超出范围,因此被销毁),那么您仍然可以使用char*
但是,您的示例代码存在多个问题。您要执行以下操作:
std::string* hackyStringPointer = myCstring - 6;
但我想你的意思是
char* hackyStringPointer = myCstring;
首先,您不能将char*强制转换为字符串*,其次,您不想在char*开始之前转换。char*指向字符串的第一个字符,您可以使用它来访问一直到尾随0字符的字符。但是,您不应该在第一个字符之前或尾随的0字符之后,因为您不知道该内存中有什么,或者它是否存在。您无法将从
std::string::c_str()
获得的const char*
转换为std::string*
。无法执行此操作的原因是c_str()
返回指向字符串数据的指针,而不是字符串对象本身
如果您试图获取std::string
,以便可以使用它的成员函数,那么您所能做的就是将myCstring
包装成一个字符串。这是一个非复制包装器,允许您将c字符串视为std::string
。要做到这一点,你需要像
std::string_view sv{myCstring, std::strlen(myCstring)};
// use sv here like it was a std::string
无法将从
std::string::c_str()
获取的const char*
转换为std::string*
。无法执行此操作的原因是c_str()
返回指向字符串数据的指针,而不是字符串对象本身
如果您试图获取std::string
,以便可以使用它的成员函数,那么您所能做的就是将myCstring
包装成一个字符串。这是一个非复制包装器,允许您将c字符串视为std::string
。要做到这一点,你需要像
std::string_view sv{myCstring, std::strlen(myCstring)};
// use sv here like it was a std::string
是的(看起来),虽然我同意,如果我需要这样做,它是