数组C中的最大值

我收到编译错误,我无法解决。 我需要创建一个初始化in数组的程序,然后编写一个最大的函数,它接受2个参数,一个数组和它的长度,并返回数组中最大元素的索引。 然后我将从main调用此函数。 谁能告诉我这是什么问题?

errors:part1.c: part1.c: In function 'main': part1.c:6:3: warning: implicit declaration of function 'largest' part1.c:7:23: error: expected expression before ']' token part1.c: In function 'largest': part1.c:17:4: warning: statement with no effect 

谢谢!

 #include  int main() { int myArray[]={1,2,3,4,5,6}; largest(myArray,6); printf("%d",myArray[]); return 0; } int largest(int array[], int length) { length = sizeof(array)/sizeof(array[0]); int i = 1; int max = array[0]; for(i; i<length; i++) { if(max < array[i]) { max = array[i]; } } return max; } 

C一次编译你的代码。 这意味着应该在使用之前定义所有内容。 您的函数largest是在使用后定义的,因此一旦编译器看到

 largest(myArray,6); 

它仍然不知道存在largest

解决方案是要么移动main以上的largest定义,要么更好, 向前声明函数:

 #include  int largest(int array[], int length); int main() { int myArray[]={1,2,3,4,5,6}; largest(myArray,6); printf("%d",myArray[]); return 0; } int largest(int array[], int length) { /* implementation of largest */ } 

此外, sizeof(array)不会为您提供largest的元素数,因为在函数调用时该信息会丢失。 您可以在函数调用中将该表达式移动到compute并传递length参数:

 largest(myArray,sizeof(myArray)/sizeof(myArray[0])); 

这也可能是一个错字,但您可能意味着存储和打印最大值:

 int max = largest(myArray,sizeof(myArray)/sizeof(myArray[0])); printf("%d\n",max); 

问题1

在定义之前,在main()使用largest() 。 使用原型,或移动main()上方的定义。

问题2

在:

 length = sizeof(array)/sizeof(array[0]); 

您将length声明为int length ,但为其指定size_t类型的东西。 这导致错误error: 'length' redeclared as different kind of symbol在您的问题的原始版本中error: 'length' redeclared as different kind of symbol

问题3

 for(i; i 

你没有为i赋值。 你的意思是

 for(i=0; i 

? 虽然您之前为i分配了一个值,但我相信这会导致warning: statement with no effect (尽管在提供的代码中没有行号很难确定)。

此外,C中的数组是基于0的。 您可能希望将i初始化为0而不是1。

问题4

在线

 printf("%d",myArray[]); 

您使用%d作为格式说明符,这意味着提供的参数应该是一个整数值。 你提供一个数组。

main() largest()之前放置一个maximum largest() 声明来解析隐式声明警告

 int largest(int array*, int length); int main() 

错误错误:’]’令牌之前的预期表达式是由以下原因引起的:

 printf("%d",myArray[]); 

要打印最大值,您需要存储largest()的结果或将其用作printf()的参数:

 printf("%d", largest(myArray, 6)); 

这不是你所期望的:

 length = sizeof(array)/sizeof(array[0]); 

当数组作为参数传递时,它会衰减为指针。 它相当于:

 length = sizeof(int*)/sizeof(int); 

只需使用length参数来控制迭代。 建议将参数设置为largest() const因为函数不会修改它们。


警告:声明无效 ,由i;引起i;for

 for(i; i 

改成:

 for(; i 

要么:

 for(i = 0; i 

或者如果是C99:

 for(int i = 0; i 

你也可以将main()的定义移到main()的定义之上,它会起作用。

很多人都指出了很多问题,但没有人提到过这个问题:

 int largest(int array[], int length) { length = sizeof(array)/sizeof(array[0]); 

不, sizeof没有做你认为它在这里做的事情。 它不会神奇地知道您的分配大小,只需要基础类型的大小。 你所做的相当于sizeof(int*)/sizeof(int)

您应该信任调用者给您的长度参数。 使用sizeof无法获得数组的实际大小,只允许调用者告诉你它有多大。

您有错误和警告..错误显然更重要。

  printf("%d",myArray[]); 

%d格式规范意味着您要编写一个int值,但情况并非如此,以及可能导致错误的原因。

还有其他一些值得你注意的警告,例如没有为你的’最大’函数等提供函数原型 ,但这些警告是修复阻止编译的错误的第二个警告。

当然,警告也应该被消除,或者在检查之后应该有意识地决定忽略它们。