我正在尝试编写一个获取数组中多数元素的程序。但是我收到这个奇怪的错误。我的代码是:
\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}\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n为什么我不断收到此错误?现在,我所做的就是获取并打印长度。而已。我尝试了不同的编译器,它说存在分段错误,无论这意味着什么。
\n这并不奇怪。这是预料之中的。当在初始化的 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)
你的编译器抱怨你这一点是正确的。
标准提到了这一点:-
标量的初始值设定项应为单个表达式,可以选择用大括号括起来。对象的初始值是表达式的初始值(转换后);应用与简单赋值相同的类型约束和转换,将标量的类型视为其声明类型的非限定版本。
由于没有这个 - 你使它成为未定义的行为。这不是您之前给出的用于初始化的单个表达式int。这就是为什么它是未定义的行为。
此外,您收到的第一条错误消息 - 没有任何类型信息的参数被认为是 int 类型。您定义函数的方式提醒了函数定义的 K&R 表示法。
int find_majority_element(arr)
int *arr;
{
int length = sizeof(arr);
return length;
}
Run Code Online (Sandbox Code Playgroud)
现在这几乎已经过时了。
| 归档时间: |
|
| 查看次数: |
7899 次 |
| 最近记录: |