背景
在C语言中,我有一个函数接受一个数组作为参数。这个参数被用作该函数的输出。该输出始终具有相同的大小。我的要求是:
- 让任何阅读代码的人都能清楚地知道所需的大小(尽管它已经在函数注释中),
- 最好编译时输出一个警告或错误,以便我可以在运行时之前预防问题。
一个可能的解决方案
我在这里找到了一个看起来像解决方案的网址:https://hamberg.no/erlend/posts/2013-02-18-static-array-indices.html,但如果我尝试传递比所需大小更小的数组时,我无法在编译时获得警告或错误。
下面是我的完整程序main.c:
void test_array(int arr[static 5]);
int main(void)
{
int array[3] = {'\0'};
test_array(array); // A warning/error should occur here at compilation-time
// telling me my array does not meet the required size.
return 0;
}
void test_array(int arr[static 5])
{
arr[2] = 0x7; // do anything...
}
与本博客相反,我使用gcc(版本7.4.0)而不是clang,使用以下命令:
gcc -std=c99 -Wall -o main.out main.c
在我的代码中,我们可以看到test_array()函数需要一个5个元素的数组。我传递了一个3个元素的数组。我希望编译器能够给出相应的提示。
问题
在C语言中,如何强制一个函数参数作为一个数组具有给定的大小?如果不是,它应该在编译时可见。
static
,但编译器对此的支持基本上不存在。(有些编译器会在看到你向这样的参数传递空指针时发出警告,但他们通常不予理睬。)你可以传递一个数组指针,例如int (*)[5]
,这将要求调用者传递一个指向 5 个int
数组的指针,但它必须恰好是 5 个;他们不能传递一个 6 个int
的数组。 - Eric Postpischil[
和]
中指定的。如果关键字static
也出现在数组类型派生的[
和]
中,则对于每次函数调用,相应实际参数的值应提供访问至少具有由大小表达式指定的元素数量的数组的第一个元素的访问权限。” - alx - recommends codidact