gpt4 book ai didi

c - 如何在C中获取数组参数的实际大小?

转载 作者:行者123 更新时间:2023-11-30 18:28:02 25 4
gpt4 key购买 nike

编辑:虽然有人认为这个问题与他们发布链接的问题相同。这是一个非常不同的问题。

考虑以下因素:

#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;
}

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

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

sizeof(*abuffer) 是 2,我认为这是相当有问题的,但我不想争论它。

sizeof(BUFFER_SPACE) 应该是 200。

我的问题是:有没有办法从参数(本例中为缓冲区)获取 200 的值,或者使用类型是获取它的唯一方法?

最佳答案

让我们首先看看如何将数组传递给函数 -

引用 C11,章节 §6.7.6.3p7

A declaration of a parameter as "array of type" shall be adjusted to "qualified pointer to type", where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation. ...

这意味着你的函数的原型(prototype)实际上变成 -

void Function(WCHAR *abuffer);

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

我想你已经明白为什么sizeof(abuffer)8——因为它是一个指针。

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

回答你的主要问题,有没有办法让函数知道缓冲区的大小,有两种方法 -

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

    void Function(BUFFER_SPACE *abuffer);

    并在各处使用*abuffer而不是abuffersizeof(*abuffer) 现在也将返回 200,因为类型信息被正确保留。

关于c - 如何在C中获取数组参数的实际大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50362573/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com