我正在尝试将整个数组传递给函数,但我得到的最后一个值总是垃圾值而不是3.请指出我犯了错误的地方。
#include<stdio.h>
#include<conio.h>
main() {
int array[3] = {0, 1, 2, 3};
display(&array[0], 3);
}
display(int *j, int n) {
int i;
for(i=0; i<=n; i++) {
printf("\n%d", *j);
j++;
}
}
答案 0 :(得分:3)
你的for循环中有一个off-by-one error。您的数组只有三个元素。您尝试读取四个元素而不是三个。
将您的代码更改为此(请注意<
而不是<=
):
for (i = 0; i < n; i++) {
当你只有三个元素时,你也尝试用四个元素初始化数组:
int array[3] = {0, 1, 2, 3};
也许您可以尝试更改编译器设置,将其标记为警告/错误。那么你可能会得到类似的东西来通知你这个问题:
prog.c: In function ‘main’: prog.c:13: error: excess elements in array initializer prog.c:13: error: (near initialization for ‘array’)
答案 1 :(得分:3)
数组变量表示第一个元素的地址,因此不需要在函数调用中使用&
地址运算符,而另一个问题是数组的size
。
main() {
int array[4] = {0, 1, 2, 3};
display(array, 3);
}
display(int *j, int n) {
int i;
for(i=0; i<=n; i++) {
printf("\n%d", *j);
j++;
}
}
答案 2 :(得分:2)
代码中有一些观察结果:
1. main()
应为int main(void)
或int main(int argc, char **argv)
。此外,您需要从main
返回一个int值,何时将其更改为int main(void)
或int main(int argc, char **argv)
2.您正在初始化包含4个值的3个元素的数组
声明为int array[3] = {0, 1, 2};
或int array[] = {0, 1, 2, 3};
(这将创建一个包含4个元素的数组)
3. display(int *j, int n)
应该有一个返回类型说void display(int *j, int n)
(否则它默认为int
,在这种情况下函数不返回任何值)。在这种情况下,您必须在使用前定义该功能
4.在当前情况下,对于函数display
,您传递的是3个元素的数组,并在i
循环中访问索引3处的元素(当n
等于for
时)这是第4个元素(即超出界限,是未定义的行为)。请记住,C中的数组是零索引。因此for(i=0; i<=n; i++)
应为for(i=0; i<n; i++)
希望这有帮助!
答案 3 :(得分:1)
您的数组声明有3个元素,但您使用4初始化它:
int array[3] = {0, 1, 2, 3};
答案 4 :(得分:1)
您只为3个整数创建一个数组,但将4个整数放入其中。但是错误是当你打印数组时,你打印了四个条目,但只有三个条目存在。
答案 5 :(得分:1)
您不能将“整个数组传递给函数” - C不会这样做。相反,您将指针传递给数组的第一个元素。
main() {
int array[3] = {0, 1, 2, 3};
main
应声明为int main(int argc, char* argv[])
。键入并不是那么可怕,如果你足够关心,你甚至可以让你的文本编辑器为你做这件事。
您已声明array
仅包含三个项目,但将四个项目存储到数组中。这应该至少抛出一个编译警告。注意那些警告。不要指定数组的大小,除非该大小至关重要(比方说,如果你想跟踪美国状态,那么int states[50] = { ... };
可能有意义。现在。也许这是一个糟糕的例子。)
for(i=0; i<=n; i++) {
printf("\n%d", *j);
j++;
for(i=0; i<=n; i++)
通常是一个错误 - C数组索引从0
到n-1
,而不是0
到n
。你正在阅读一个过去的数组,而且这个价值并不奇怪是垃圾。
此外这段代码很尴尬;你应该每次只使用printf("\n%d", j[i])
和而不是增加j
。以这种方式将两个变量增加为“循环变量”是将来编写错误的一个方法。 (如果需要在每次循环迭代时更新两个变量,请将两者放在for(;;i++, j++)
循环的最后一部分中。)