【问题标题】:sizeof is not returning correct size of LPVOID variable [duplicate]sizeof 未返回正确大小的 LPVOID 变量 [重复]
【发布时间】:2014-10-02 08:36:18
【问题描述】:

sizeof 没有返回 tData 指向的数据的大小 我的编译器 Visual Studio C++ 2012

bool FixReloc(LPVOID pModule,LPVOID tData,LPVOID pAddressNew,DWORD pAdrressOld,WORD fImageX64)
{
    DWORD iDelta = (DWORD)pAddressNew - pAdrressOld;
    long iSize =  sizeof (tData);

iSize 是 4,但是当我创建 tData 时,我做到了

byte* tData = new byte[2057];
relocRaw = reinterpret_cast<byte*>(pointerToRawData + (virtualAddressBaseReloc - virtualAddress));

iSize 应该是 2057 有什么解决办法吗?

【问题讨论】:

  • 您机器上的指针是 4 字节宽。
  • 一旦我们有了指针,就不可能得到 sizeof 缓冲区。 sizeof(LPVOID) == 4(通常); sizeof(*tData)(在 FixReloc 内部)可以是 0 或 1(未定义)。
  • 为什么您认为sizeof 应该这样做?谁教你这么废话的?
  • @CaptainObvlious 我没学过 c++ 我自己学过

标签: c++ visual-c++


【解决方案1】:

您机器上的指针是 4 字节宽。如果你想获得指针指向的对象的大小,你必须取消引用它:

long iSize = sizeof(tData);  // Gets size of pointer = 4
iSize = sizeof(*tData);      // Gets size of pointed object, which is sizeof(void), which is implementation defined

不幸的是,取消引用 void * 对您来说不是很有用,因为它的实现已定义(或未定义),即使已定义它也无助于您获取字节数组的大小。

【讨论】:

  • sizeof(*tData) == 1 因为 tData 是 byte*sizeof(byte) == 1。一旦有了指针(而不是数组 - byte[2057]&amp;),就不可能获得真正的数据大小
  • sizeof(*tData) == 1。要获取 tData 指向的内存块的大小,您必须将其传递给单独的参数,或者解开 tData 所在的堆块分配找到它。
  • 有没有什么方法可以得到它的真实尺寸而不在func中发送额外的尺寸参数?
  • @user3660095:不是真的,不。
  • @firda: LPVOIDvoid* 的类型定义(reference,所以sizeof *tData 应该 被拒绝并显示错误消息。类型void没有大小。
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 2012-10-16
  • 2021-04-03
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-24
相关资源
最近更新 更多