C++ 你能从字符串的c_str()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指向现有字符串的内容,那么有没有办法安全地访问源于它的父字符串的指针?例如,我可以做这样

我有一个const char指针,我肯定它来自一个字符串。例如:

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
是的(看起来),虽然我同意,如果我需要这样做,它是