我试图编写一个获取数组中多数元素的程序。但是我得到了这个奇怪的错误。我的代码是:
#include <stdio.h>
int find_majority_element(arr) {
int length = sizeof(arr);
return length;
}
int main()
{
int input = { 12, 3, 2, 1, 2, 4, 2, 2, 9, 2, 2, 1, 2 };
printf(find_majority_element(input));
}
执行时,我收到此错误:
$gcc -o main *.c
main.c: In function ‘find_majority_element’:
main.c:3:5: warning: type of ‘arr’ defaults to ‘int’ [-Wimplicit-int]
int find_majority_element(arr) {
^~~~~~~~~~~~~~~~~~~~~
main.c: In function ‘main’:
main.c:21:23: warning: excess elements in scalar initializer
int input = { 12, 3, 2, 1, 2, 4, 2, 2, 9, 2, 2, 1, 2 };
^
$main
timeout: the monitored command dumped core
sh: line 1: 176437 Segmentation fault timeout 10s main
为什么我一直收到此错误?现在,我所做的就是获取和打印长度。而已。我尝试了一个不同的编译器,它说有一个分段错误,无论这意味着什么。
答案 0 :(得分:4)
这并不奇怪。这是预料之中的。 int x = {2}
在初始化{}
的RHS中使用时,这在=
内部除此之外的任何内容都是有效的 - 它是未定义的行为。在这里,您尝试使用多个值初始化int
变量。
什么会纠正它? int x[]={1,2,3,4}
是的,这是正确的 - 初始化一个包含4个元素的数组。
还有什么?将数组传递给函数时,它将转换为指向第一个元素的指针。将sizeof
应用于它将不会为您提供数组的长度。
还有更多。在main()
即使你做了其他功能所做的事情 - 它仍然是错误的。
printf("Length of array is %zu\n",sizeof(x)/sizeof x[0]);
这将为您提供数组的长度。这是获得它的正确方法。 (有一种情况sizeof(x)
将正确返回数组的长度 - 即x
为char
数组时。
代码将是这样的: -
#include <stdio.h>
int find_majority_element(size_t len, int* arr) {
...
return someIntVar;
}
int main(void)
{
int input[] = { 12, 3, 2, 1, 2, 4, 2, 2, 9, 2, 2, 1, 2 };
size_t len = sizeof(input)/sizeof(input[0]);
printf("%d\n", find_majority_element(len, input));
return 0;
}
你的编译器是抱怨你。
标准提到: -
来自6.7.9p11
标量的初始值设定项应为单个表达式,可选地用大括号括起来。对象的初始值是表达式的初始值(转换后);与简单赋值相同的类型约束和转换适用,将标量的类型作为其声明类型的非限定版本。
没有这个 - 你做了不明确的行为。这不是您之前提供的单个表达式 - 用于初始化int
。这就是为什么它是未定义的行为。
您还有第一条错误消息 - 没有任何类型信息的参数被认为是int类型。您定义函数的方法是提醒函数定义的K&amp; R表示法。
int find_majority_element(arr)
int *arr;
{
int length = sizeof(arr);
return length;
}
现在几乎已经过时了。