标量初始化程序中的多余元素,错误我一直在C中

时间:2018-02-24 13:56:25

标签: 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

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

1 个答案:

答案 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)将正确返回数组的长度 - 即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("%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;
}

现在几乎已经过时了。