Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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++ 如何将结构从指针复制到void?_C++_Pointers_Struct - Fatal编程技术网

C++ 如何将结构从指针复制到void?

C++ 如何将结构从指针复制到void?,c++,pointers,struct,C++,Pointers,Struct,假设我有一个DLL包含一个结构,但我不知道这个结构的细节。但我有一个指向结构地址的空指针 有人能告诉我怎样才能得到结构的细节吗?例如,将结构输出到文本文件 谢谢大家! 如果没有类型定义,则无法了解结构的详细信息。在没有类型定义的情况下复制一个以void指针开头的区域会得到原始的二进制数据,但是您不知道它在哪里结束,或者哪些片段表示哪些变量。有些值可以是整数值,也可以是指针地址。有各种各样的可能性 您应该尝试获取头文件 如果您有调试/符号文件(例如Windows上的.pdb文件),您可能能够从中收

假设我有一个DLL包含一个结构,但我不知道这个结构的细节。但我有一个指向结构地址的空指针

有人能告诉我怎样才能得到结构的细节吗?例如,将结构输出到文本文件


谢谢大家!

如果没有类型定义,则无法了解结构的详细信息。在没有类型定义的情况下复制一个以void指针开头的区域会得到原始的二进制数据,但是您不知道它在哪里结束,或者哪些片段表示哪些变量。有些值可以是整数值,也可以是指针地址。有各种各样的可能性

您应该尝试获取头文件


如果您有调试/符号文件(例如Windows上的.pdb文件),您可能能够从中收集一些信息,或者在Linux上使用GDB调试该程序,这仅在您有该程序的调试版本时才起作用。请参阅GDB中的“whatis”和“ptype”命令。

没有类型定义,您无法了解结构的详细信息。在没有类型定义的情况下复制一个以void指针开头的区域会得到原始的二进制数据,但是您不知道它在哪里结束,或者哪些片段表示哪些变量。有些值可以是整数值,也可以是指针地址。有各种各样的可能性

您应该尝试获取头文件


如果您有调试/符号文件(例如Windows上的.pdb文件),您可能能够从中收集一些信息,或者在Linux上使用GDB调试该程序,这仅在您有该程序的调试版本时才起作用。请参阅GDB中的“whatis”和“ptype”命令。

如果没有结构定义,您永远不会知道这一点。此外,由于对齐和填充,在实际内存位置的用户变量之间可能存在“漏洞”

如果你有

struct mystr {
    char x;
    int y;
};

默认情况下,这种结构的大小很可能为8,在一个字节的
char x
之后,将有三个字节的填充(理论上是随机值),然后是4个字节的
int y
,但这取决于编译器及其指令

如果没有结构定义,您永远不会知道这一点。此外,由于对齐和填充,在实际内存位置的用户变量之间可能存在“漏洞”

如果你有

struct mystr {
    char x;
    int y;
};

默认情况下,这种结构的大小很可能为8,在一个字节的
char x
之后,将有三个字节的填充(理论上是随机值),然后是4个字节的
int y
,但这取决于编译器及其指令

如果没有
struct
的定义,您就不能这样做。例如,适当的头文件。谢谢,我将尝试查找相应的头文件。应该注意的是,当API不想让人们知道其数据的详细信息时,通常会特别使用void指针,这样他们可以在将来更改数据布局,而不会破坏任何人的代码。因此,违背API作者的意图在这里可能是一个坏主意,因为它可能会在将来当实现细节发生变化,而您的程序(现在取决于那些细节不发生变化)中断时咬到您。如果没有
结构的定义,您就不能这样做。例如,适当的头文件。谢谢,我将尝试查找相应的头文件。应该注意的是,当API不想让人们知道其数据的详细信息时,通常会特别使用void指针,这样他们可以在将来更改数据布局,而不会破坏任何人的代码。因此,C++ API作者的意图可能是个坏主意,因为在将来实现细节改变时,它可能会咬你,而你的程序(现在取决于那些不改变的细节)会被打断。谢谢,我会尝试找到相应的头文件。即使您知道
void*
确实应该是
Base*
,但在运行时它指向
派生的*
的可能性仍然存在。此外,复制C++类中的所有位都不能保证工作正常。一个普通的类失败了,是<代码> STD::String 。谢谢,我会尝试找到相应的头文件。因为它是C++的标记,所以你也必须考虑继承。即使您知道
void*
确实应该是
Base*
,但在运行时它指向
派生的*
的可能性仍然存在。此外,复制C++类中的所有位都不能保证工作正常。失败的常见类是
std::string