为什么我要在函数头中声明C数组参数的大小?

时间:2011-03-03 22:08:33

标签: c

任何人都可以告诉我为什么我要在函数头中指定C数组参数的大小?例如:

void foo (int iz[6]) { iz[42] = 43; }

使用:

int is[2] = {1,2,3};

我们得到了一个有用的错误。也许它有助于评论/文档?

4 个答案:

答案 0 :(得分:13)

  

任何人都可以告诉我为什么我要在函数头中指定C数组参数的大小?例如:

     

void foo(const char sz [6]){sz [42] = 43; }

IMO,你不应该。当您尝试将数组传递给函数时,实际传递的是指向数组开头的指针。由于函数接收的是指针,因此最好将其写为显式:

void foo(char const *sz)

然后,由于现在很清楚该函数没有给出大小的线索,所以将其作为单独的参数添加:

void foo(char const *sz, size_t size)

答案 1 :(得分:10)

这样做的唯一有意义的原因是出于文档目的 - 告诉未来用户函数期望接收至少那么多元素的数组。但即便如此,这也是一个常规问题 - 您必须提前与其他用户达成一致意见。语言(编译器)无论如何都会忽略该大小。您的函数声明等同于void foo(int iz[])void foo(int *iz)

使编译器有意义的唯一方法是将其声明为

void foo (int iz[static 6])

作为对编译器的承诺,该数组将具有至少6个元素,这意味着编译器将能够使用该假设优化该代码。而且,如果你真的想采用上面提到的约定,那么特别用static声明数组参数大小更有意义,因为语言明确定义了这个结构的语义。

你是什么意思"我们得到一个有用的错误"我不清楚。代码

int is[2] = {1,2,3};
is[42] = 42;

不包含任何约束违规。它会产生未定义的行为,但在编译期间不需要生成诊断消息。换句话说,不,我们没有得到任何"有用的错误"从此。

答案 2 :(得分:7)

这是一个评论。数组被降级为函数参数中的指针。但是,注释仍然有用,即使编译器没有读取它们。

答案 3 :(得分:0)

如果您想告诉客户端代码必须传递已定义大小的数组,这是一个有用的注释,即:

void foo(const char bar[5]);
/* It is expected that foo function receives an array of size 5 */

然而,文档在代码检查中并没有取代:

void foo(const char bar[5])
{
    if (!bar) error();
    if (strlen(bar) != 4) error();
    /* ... */
}