标量初始化器中的多余元素,错误我一直进入C



我正在尝试编写一个在数组中获得多数元素的程序。但是我得到了这个奇怪的错误。我的代码是:

#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

为什么我继续遇到此错误?现在,我要做的就是获得和打印长度。而已。我尝试了一个不同的编译器,它说有一个分割的故障,无论是什么意思。

这并不奇怪。预计。int x = {2}{}内部使用=的RHS中,这是有效的。在这里,您尝试初始化具有多个值的int变量。

什么会纠正它?int x[]={1,2,3,4}是的,这是正确的 - 初始化具有4个元素的数组。

还有什么?当您将数组传递到函数时,它将转换为指针转换为第一个元素。将sizeof应用于它不会给您数组的长度。

还有更多。在main()中,即使您在其他功能中所做的事情也是如此 - 仍然是错误的。

printf("Length of array is %zun",sizeof(x)/sizeof x[0]);

这将为您提供数组的长度。这是获得它的正确方法。(在某些情况下,sizeof(x)将正确返回数组的长度 - 即xchar数组(。

代码将是这样的: -

#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("%dn", 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;
}

这几乎已经过时了。

最新更新