gpt4 book ai didi

c - 传递数组时在C中的函数参数中强制数组大小

转载 作者:太空狗 更新时间:2023-10-29 15:17:20 25 4
gpt4 key购买 nike

上下文

在 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 语言中,如何强制函数参数为数组,使其具有给定的大小?如果不是,它应该在编译时引起注意。

最佳答案

如果你传递一个指向数组的指针而不是第一个元素的指针,你将得到一个不兼容的指针警告:

void foo(int (*bar)[42])
{}

int main(void)
{
int a[40];
foo(&a); // warning: passing argument 1 of 'foo' from incompatible pointer type [-Werror=incompatible-pointer-types]
// note: expected 'int (*)[42]' but argument is of type 'int (*)[40]'

int b[45];
foo(&b); // warning: passing argument 1 of 'foo' from incompatible pointer type [-Werror=incompatible-pointer-types]
// note: expected 'int (*)[42]' but argument is of type 'int (*)[45]'
}

编译时加入-Werror使其报错。

godbolt

关于c - 传递数组时在C中的函数参数中强制数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56176512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com