This question already has answers here:
How to find the 'sizeof' (a pointer pointing to an array)?
(13个回答)
2年前关闭。
编辑:虽然有人认为这个问题与他们发布链接的问题相同。这是一个非常不同的问题。
考虑以下:
类型BUFFER_SPACE是一个大小为200个字节的数组(假定为UTF16)
在大多数情况下,声明一个变量,例如:
将导致wprintf输出200(按预期)。
现在,考虑以下简单的示例程序:
我想获取函数中buffer参数的整个大小。使用VC ++并编译为64位,
sizeof(abuffer)为8,这是有意义的,因为它是指向数组的指针
sizeof(* abuffer)为2,我认为这是有问题的,但是,我不想对此进行辩论。
sizeof(BUFFER_SPACE)应该是200。
我的问题是:是否有一种方法可以从参数中获取200的值(在这种情况下为缓冲),还是使用类型来获取它的唯一方法?
在此函数的主体中,编译器不再具有类型信息。它可能是
我认为您已经理解了为什么
现在来到
要回答您的主要问题,该函数是否有办法知道缓冲区的大小,有两种方法-
您将信息作为第二个参数传递。但这不是必需的,因为大小始终为
您将指针传递给
并在所有地方使用
(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