以这段代码为例:
#include <stdio.h>
void print_array(size_t size, unsigned (*myarray)[])
{
printf("Array size: %lu\n", size);
for (size_t i = 0; i < size; ++i)
printf("%u ", (*myarray)[i]);
printf("\n");
}
int main() {
unsigned myarray[] = { 9, 8, 7, 6, 5 };
print_array(sizeof(myarray) / sizeof(unsigned), &myarray);
return 0;
}
使用clang分析器编译时(通过gcc 10.1.0),警告为:
src/main.c:7:3: warning: 2nd function call argument is an uninitialized value
printf("%u ", (*myarray)[i]);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
输出为:
Array size: 5
9 8 7 6 5
这段代码中的错误是什么?将指针传递到C中的数组的正确方法是什么?
这似乎是错误的肯定。代码没有问题-尽管样式有点奇怪,但它们都是有效的C。
如果该备注是关于实际缺少初始化的,则可能与该工具未检查调用方有关。但是,即使分析器仅考虑本地转换单元,也无法将传递的变量默认为未初始化。那将是一个非常奇怪的假设。
可能是分析器感到不安,您实际上是将a传递给unsigned (*myarray)[5]
了一个期望的函数unsigned (*myarray)[]
(指向不完整类型的指针,未指定大小的数组)。您可以尝试将参数更改为,以unsigned (*myarray)[size])
查看它是否使该工具更快乐。
编辑:数组指针类型虽然兼容,所以该工具也不应该因为这个原因而抱怨。根据C17 6.7.6.2/6,一种或两种数组类型可以忽略大小说明符,并且仍然兼容:
对于两个兼容的数组类型,它们都应具有兼容的元素类型,并且如果两个大小说明符都存在且为整数常量表达式,则两个大小说明符均应具有相同的常量值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句