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

标签 c arrays parameters typedef sizeof

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

考虑以下因素:

#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/

相关文章:

c - 将指向结构数组的指针传递给函数

javascript - 使用 ecmascript 6 为数组的每个元素保存新的 Mongoose 模式

javascript - 我可以在javascript中将整个数组插入到其他数组位置吗?

javascript - localStorage的返回类型是什么?

javascript - 如何使用 html 和 javascript 获取和传递链接参数

c - 如何生成0到1之间的随机数?

c - 将字符串从输入字段传递到函数失败 - GTK c 语言

java - 在运行时,获取传递给方法的参数/参数的数量,无论是否带有可变参数,在 Java 中

java - 在方法参数中设置数组项

C - 找出所有不同的数字