Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从LPVOID检索字符串_C++_String - Fatal编程技术网

C++ 从LPVOID检索字符串

C++ 从LPVOID检索字符串,c++,string,C++,String,有人能解释一下并帮我吗。 假设我有这样一个函数,其中lpData包含指向所需数据的指针 void foo(LPVOID lpData) { } 什么是正确的检索方法。这很管用,但最后我看到了一些奇怪的角色 void foo(LPVOID lpData) { LPVOID *lpDataP = (LPVOID *)lpData; char *charData = (char*)lpDataP; //i log charData.... } 我更喜欢使用字符串,但我不知道如何检

有人能解释一下并帮我吗。 假设我有这样一个函数,其中lpData包含指向所需数据的指针

void foo(LPVOID lpData) {

}
什么是正确的检索方法。这很管用,但最后我看到了一些奇怪的角色

void foo(LPVOID lpData) {
    LPVOID *lpDataP = (LPVOID *)lpData;
char *charData = (char*)lpDataP;
    //i log charData....
}
我更喜欢使用字符串,但我不知道如何检索数据,我只是在尝试使用字符串时出现空指针错误。lpData持有一个指针,对吗?(但我的函数是lpData不是*lpData)所以它不工作了?我做错了吗

string *datastring = reinterpret_cast<std::string *>(lpData);
string*datastring=reinterpret\u cast(lpData);

这就是我所尝试的。

至少有两种方法:

void foo(LPVOID lpData)
{
    char *charData = (char*)lpData;
    //i log charData....
}

void foo(LPVOID lpData)
{
char*charData=static\u castlpData;
//我记录charData。。。。
}
这很管用,但最后我看到了一些奇怪的角色

void foo(LPVOID lpData) {
    LPVOID *lpDataP = (LPVOID *)lpData;
char *charData = (char*)lpDataP;
    //i log charData....
}
这意味着您的字符串不是以null结尾的,也就是说,它没有标记字符串结尾的
NUL
字节(
0

C字符串必须是。*当您记录C字符串(
char*
)时,它会一直记录字符,直到找到
NUL
。如果字符串的末尾没有一个,它将继续遍历随机内存,直到找到一个为止(或者直到您遇到页面错误并崩溃为止)。这很糟糕。没有办法修复它;一旦你失去了长度,就没有办法恢复了

但是,未终止的字符串及其长度可能很有用。许多函数可以将
char*
旁边的长度作为额外参数(例如
string
构造函数)或其他参数(例如
printf
格式字符串中的宽度说明符)

所以,如果你取长度,并且只调用同样取长度的函数,或者只是创建一个以null结尾的拷贝并使用它,你就可以了。因此:

void foo(LPVOID lpData, int cchData) {
    string sData(static_cast<const char *>(lpData), cchData);
    // now do stuff with sData
}
这几乎肯定是错误的。**LPVOID只是指向一堆字符。您的意思是要将这些字符解释为
字符串
对象。但是
字符串
对象是一些标题信息(可能是长度和容量等)加上指向一组字符的指针。把一个当作另一个会导致垃圾或崩溃***


<>是,你使用C++,不是C,但是<代码> char */COD>是“C字符串”。 **如果您确实有一个保持活动状态的
字符串
对象,并且您将指向该对象的指针隐藏在
LPVOID
中,并且现在已检索到它(例如,使用
SetWindowLongPtr
/
GetWindowLongPtr
),那么从
LPVOID
转换为
string*
是有意义的。但我怀疑你在做什么。(如果是,则不需要重新解释转换。
void*
的全部要点是它不被解释,因此没有什么可以重新解释的。只需使用
静态转换


***或者,最糟糕的是,它可能看起来有效,但随后会导致难以跟踪的崩溃或腐败。某些标准C++库使用一个特殊的分配器将字符头放在字符之前,并返回指向第一个字符的指针,以便在代码< char *< /COD>可以使用的任何地方使用<代码>字符串。在
字符串
类中,每个方法都必须向后伪造
这个
指针;例如,它不只是说
m_length
,而是做一些类似于
static_cast(this)[-1]>m_length
。但是另一种方法是不可行的,如果你只有一堆字符,而不是一个
字符串
对象,那么福吉将读取恰好在字符之前分配的任何字节,并尝试将它们解释为整数,因此你可能会认为你有一个长度为0的字符串,或182423742341241243。

LPVOID
已经是
void*
。如果你传递一个指向
std::string
,只需使用
static\u cast
。你为什么要从
LPVOID
void*
,指向任何东西的指针)到
LPVOID*
void**
,指向任何东西的指针)进行转换呢?谢谢你解释得很好,我犯了很多错误。
string *datastring = reinterpret_cast<std::string *>(lpData);