【发布时间】:2019-10-04 04:50:19
【问题描述】:
上下文
在 C 语言中,我有一个以数组为参数的函数。此参数在此函数中用作输出。输出总是相同的大小。我会:
- 让任何阅读代码的人都清楚所需的大小(不过,它已经在函数 cmets 中了),
- 理想情况下,编译输出警告或错误,这样我就可以防止在编译时而不是运行时出现问题。
一个潜在的解决方案
我在这里找到: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 中,如何强制作为数组的函数参数具有给定大小?如果不是,它应该在编译时很明显。
【问题讨论】:
-
如果您删除“至少”部分,您可以获得答案(好吧,您自己也有)。这部分的答案是“没办法”。
-
如您所见,C 对此有一个特性,
static在参数声明中的数组大小中,但编译器对它的支持大多不存在。 (一些编译器如果看到你为这样的参数传递了一个空指针,他们会发出警告,但否则他们会忽略它。)你可以传递一个指向数组的指针,例如int (*)[5],这将要求调用者传递一个指针到 5 个int的数组,但它必须正好是 5;他们无法传递 6 个int的数组。 -
@Eugene-sh 我之所以写这句话,至少是因为我提到的博客中的这句话:“编译器可以在看到调用者调用函数时发出警告,而不是 10 个或更多整数的数组。 ”。但是我可以删除这部分以使问题更清楚。
-
不太清楚,是“可能”和“不可能”的区别。你有答案。
-
C11: 6.7.6.3.7: "将参数声明为“类型数组”应调整为“类型限定指针”,其中类型限定符(如果有)是在数组类型派生的
[和]中指定的那些。如果关键字static也出现在数组类型派生的[和]中,那么对于每次调用函数,对应的实际参数的值应提供对数组的第一个元素的访问,该数组的元素至少与大小表达式指定的一样多。"
标签: c arrays parameter-passing