【问题标题】:Getting actual size of struct获取结构的实际大小
【发布时间】:2014-08-31 01:58:53
【问题描述】:

我有一个函数需要我传递一个指针 LPVOID 和一个大小 DWORD

VirtualAllocEx 将使用这些值。

如何获得我的struct 的完整实际大小?

结构:

typedef struct CLRStartUpInfo
{
    LPCSTR pwzLibrary;
    LPCSTR pwzTypeName;
    LPCSTR pwzEntryPoint;
    LPCSTR pwzArgument;
} CLRStartUpInfo, *PCLRStartUpInfo;

我正在调用的函数:

HRESULT CallRemoteFunction(HANDLE hProcess, LPVOID lpFunction, LPVOID lpParameter, DWORD dwParameterSize)

【问题讨论】:

  • 如何获得结构的完整实际大小? - 我建议将其输入 Google。我得到了结果。
  • sizeof(CLRStartUpInfo) 不能正常工作?
  • sizeof CLRStartUpInfo? @wuqiang 不需要括号。
  • 您想知道如何获得结构的大小,但在 Google 上没有找到结果? (或者来自 size of 的线索可能会导致您搜索 size 的文档,从而导致您找到 sizeof()? )
  • 请注意,结构的大小只是冰山一角。您还必须编组指向的字符串。

标签: c++ winapi struct


【解决方案1】:

您可以使用sizeof(CLRStartUpInfo) 获取它。如果它不是 4 的倍数(32 位),Windows 操作系统会向 struct 添加填充字节。因此,如果您的实际结构大小为 7,它将添加 1 个字节并使其变为 8。

为避免您可以使用#pragma pack (1),它将限制填充。

【讨论】:

  • 这不是真的。包含 7 个字符的结构没有填充且大小为 7。人们还想知道您的答案与问题有何关系。你的意思是写评论吗?
  • @DavidHeffernan 我已经编写了这个程序。结构 s { int a;字符 b,c,d; } C; int main(int argc, char* argv[]) { printf("c %d 的大小",sizeof(c));返回0; } --> 输出为 8
  • 太可爱了。试试 ` struct s { char c1; } C; int main(int argc, char* argv[]) { printf("c %d 的大小",sizeof(c));返回0; } 看看输出是什么。就好像您没有阅读我的评论一样。我认为您不知道对齐在 Windows 上的工作原理。
  • 这对我来说是新的。我以为我知道,但我需要研究它。感谢您的评论。
【解决方案2】:

编译指示预处理器命令可用于将内容打包到字节边界。您尝试更改打包的任何操作都必须使用特定于环境的预编译器指令来完成。不同的编译器有不同的打包规则。

#pragma pack(1)
struct test
{
    char ch; // 1 byte
    int i;  // 4 bytes
}sample1, sample2;
#pragma pack
// Here is a complete function that compiles
int main()
{
    std::cout << "sizeof(sample1)" << sizeof(sample1) << std::endl;
    return 0;
}

我通过简单的谷歌搜索找到了这个。这是 MSDN 的页面。只要确保您仔细阅读警告。手动打包后,有时会出现难以理解的对齐问题。我自己并不完全理解这些问题。 http://msdn.microsoft.com/en-us/library/2e70t5y1(VS.80).aspx

【讨论】:

  • 这与问题有什么关系?
猜你喜欢
  • 2016-03-12
  • 2012-10-16
  • 1970-01-01
  • 2017-04-26
  • 2011-06-11
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多