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

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

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

附:

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

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

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

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

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

 void foo(char const *sz) 

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

 void foo(char const *sz, size_t size) 

这样做的唯一有意义的原因是出于文档目的 – 告诉未来的用户,函数期望接收至少那么多元素的数组。 但即使这是一个常规问题 – 您必须提前与其他用户达成一致意见。 语言(编译器)无论如何都会忽略该大小。 你的函数声明等同于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; 

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

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

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

 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(); /* ... */ }