标量初始值设定项中的元素过多,我在 C 中不断遇到错误

dar*_*rse -1 c

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

\n\n
#include <stdio.h>\n\nint find_majority_element(arr) {\n    int length = sizeof(arr);\n    return length;\n}\n\nint main()\n{\n    int input = { 12, 3, 2, 1, 2, 4, 2, 2, 9, 2, 2, 1, 2 };\n    printf(find_majority_element(input));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

执行时,我收到此错误:

\n\n
$gcc -o main *.c\nmain.c: In function \xe2\x80\x98find_majority_element\xe2\x80\x99:\nmain.c:3:5: warning: type of \xe2\x80\x98arr\xe2\x80\x99 defaults to \xe2\x80\x98int\xe2\x80\x99 [-Wimplicit-int]\n int find_majority_element(arr) {\n     ^~~~~~~~~~~~~~~~~~~~~\nmain.c: In function \xe2\x80\x98main\xe2\x80\x99:\nmain.c:21:23: warning: excess elements in scalar initializer\n     int input = { 12, 3, 2, 1, 2, 4, 2, 2, 9, 2, 2, 1, 2 };\n                       ^\n$main\ntimeout: the monitored command dumped core\nsh: line 1: 176437 Segmentation fault      timeout 10s main\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么我不断收到此错误?现在,我所做的就是获取并打印长度。而已。我尝试了不同的编译器,它说存在分段错误,无论这意味着什么。

\n

use*_*738 5

这并不奇怪。这是预料之中的。当在初始化的 RHS 中使用时,int x = {2}除此之外的任何内容都是有效的- 这是未定义的行为。在这里,您尝试用多个值初始化一个变量。{}=int

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

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

还有更多。即使main()你做了你在其他函数中所做的事情 - 它仍然是错误的。

printf("Length of array is %zu\n",sizeof(x)/sizeof x[0]);
Run Code Online (Sandbox Code Playgroud)

这将为您提供数组的长度。这才是正确的获取方式。(有一种情况sizeof(x)会正确返回数组的长度 - 即xis chararray 时)。

代码将是这样的:-

#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;
}
Run Code Online (Sandbox Code Playgroud)

你的编译器抱怨你这一点是正确的

标准提到了这一点:-

6.7.9p11开始

标量的初始值设定项应为单个表达式,可以选择用大括号括起来对象的初始值是表达式的初始值(转换后);应用与简单赋值相同的类型约束和转换,将标量的类型视为其声明类型的非限定版本。

由于没有这个 - 你使它成为未定义的行为。这不是您之前给出的用于初始化的单个表达式int。这就是为什么它是未定义的行为。


此外,您收到的第一条错误消息 - 没有任何类型信息的参数被认为是 int 类型。您定义函数的方式提醒了函数定义的 K&R 表示法。

int find_majority_element(arr) 
int *arr;
{
    int length = sizeof(arr);
    return length;
}
Run Code Online (Sandbox Code Playgroud)

现在这几乎已经过时了。