This question already has answers here:
How to find the 'sizeof' (a pointer pointing to an array)?
                                
                                    (13个回答)
                                
                        
                                2年前关闭。
            
                    
编辑:虽然有人认为这个问题与他们发布链接的问题相同。这是一个非常不同的问题。

考虑以下:

#define HUNDRED 100
typedef WCHAR BUFFER_SPACE[HUNDRED];


类型BUFFER_SPACE是一个大小为200个字节的数组(假定为UTF16)

在大多数情况下,声明一个变量,例如:

BUFFER_SPACE abuffer         = { 0 };

wprintf(L"sizeof abuffer        : %zd\n", sizeof(abuffer));


将导致wprintf输出200(按预期)。

现在,考虑以下简单的示例程序:

#include "stdafx.h"
#include <Windows.h>
#include <WinNt.h>

#define HUNDRED 100
typedef WCHAR BUFFER_SPACE[HUNDRED];

void Function(BUFFER_SPACE abuffer)
{
  BUFFER_SPACE anotherbuffer = { 0 };

  wprintf(L"sizeof  abuffer      : %zd\n", sizeof(abuffer));         // 8
  wprintf(L"sizeof *abuffer      : %zd\n", sizeof(*abuffer));        // 2
  wprintf(L"sizeof anotherbuffer : %zd\n", sizeof(anotherbuffer));   // 200

  // a highly undesirable solution is to apply sizeof to the type but, if the
  // type of the parameter changes, the programmer has to be aware that the
  // original/old type is being used in sizeof() someplace else in the
  // function/program

  wprintf(L"sizeof BUFFER_SPACE  : %zd\n", sizeof(BUFFER_SPACE));  // 200

  getchar();
}

int main()
{
  BUFFER_SPACE abuffer         = { 0 };

  WCHAR anotherbuffer[HUNDRED] = { 0 };

  wprintf(L"sizeof abuffer        : %zd\n", sizeof(abuffer));
  wprintf(L"sizeof anotherbuffer  : %zd\n", sizeof(anotherbuffer));
  wprintf(L"\n");

  Function(abuffer);

  return 0;
}


我想获取函数中buffer参数的整个大小。使用VC ++并编译为64位,

sizeof(abuffer)为8,这是有意义的,因为它是指向数组的指针

sizeof(* abuffer)为2,我认为这是有问题的,但是,我不想对此进行辩论。

sizeof(BUFFER_SPACE)应该是200。

我的问题是:是否有一种方法可以从参数中获取200的值(在这种情况下为缓冲),还是使用类型来获取它的唯一方法?

最佳答案

让我们开始看看如何将数组传递给函数-

引用C11§6.7.6.3p7


  参数声明为“类型数组”应调整为“类型的合格指针”,其中类型限定符(如果有)是在数组类型派生的[和]中指定的那些。 ...


这意味着您的函数原型实际上变成了-

void Function(WCHAR *abuffer);


在此函数的主体中,编译器不再具有类型信息。它可能是WCHAR[100]WCHAR[200]甚至是WCHAR[]

我认为您已经理解了为什么sizeof(abuffer)8的原因-因为它是一个指针。

现在来到sizeof(*abuffer)abuffer的类型是WCHAR*,因此*abuffer的类型将是WCHAR,因此是sizeof(*abuffer) == sizeof(WCHAR) == 2

要回答您的主要问题,该函数是否有办法知道缓冲区的大小,有两种方法-


您将信息作为第二个参数传递。但这不是必需的,因为大小始终为sizeof(BUFFER_SPACE)
您将指针传递给BUFFER_SPACE而不是BUFFER_SPACE。您可以将原型更改为-

void Function(BUFFER_SPACE *abuffer);


并在所有地方使用*abuffer而不是abuffer。现在sizeof(*abuffer)也将返回200,因为类型信息已正确保留。

09-07 16:52