Да (кажется), хотя я согласен с тем, что если мне нужно это сделать, это, скорее всего, признак того, что мой код нуждается в доработке в целом. Тем не менее, ответ, как представляется, заключается в том, что указатель строки находится за 4 слова до const char *, который возвращает c_str (), и я действительно восстановил строку * из const char *, принадлежащего строке.
#include <string>
#include <iostream>
std::string myString = "Hello World!";
const char* myCstring = myString.c_str();
unsigned int strPtrSize = sizeof(std::string*);
unsigned int cStrPtrSize = sizeof(const char*);
long strAddress = reinterpret_cast<std::size_t>(&myString);
long cStrAddress = reinterpret_cast<std::size_t>(myCstring);
long addressDifference = strAddress - cStrAddress;
long estStrAddress = cStrAddress + addressDifference;
std::string* hackyStringPointer = reinterpret_cast<std::string*>(estStrAddress);
cout << "Size of String* " << strPtrSize << ", Size of const char*: " << cStrPtrSize << "\n";
cout << "String Address: " << strAddress << ", C String Address: " << cStrAddress << "\n";
cout << "Address Difference: " << addressDifference << "\n";
cout << "Estimated String Address " << estStrAddress << "\n";
cout << "Hacky String: " << *hackyStringPointer << "\n";
//If any of these asserts trigger on any platform, I may need to re-evaluate my answer
assert(addressDifference == -4);
assert(strPtrSize == cStrPtrSize);
assert(hackyStringPointer == &myString);
Вывод этого выглядит следующим образом:
Размер строки * 4, Размер константного символа *: 4
Адрес строки: 15725656, Адрес строки C: 15725660
Разница в адресе: -4
Предполагаемый адрес строки: 15725656
Строка Hacky: Hello World!
Кажется, до сих пор это работает. Если кто-то может показать, что разница адресов между строкой и ее c_str () может со временем меняться на одной и той же платформе, или если не гарантируется, что все члены строки находятся в смежной памяти, я изменю свой ответ на «Нет». . "