在将整个数组传递给函数时获取垃圾值

时间:2011-11-23 06:31:19

标签: c arrays

我正在尝试将整个数组传递给函数,但我得到的最后一个值总是垃圾值而不是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++;
    }
}

6 个答案:

答案 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数组索引从0n-1,而不是0n。你正在阅读一个过去的数组,而且这个价值并不奇怪是垃圾。

此外这段代码很尴尬;你应该每次只使用printf("\n%d", j[i])而不是增加j。以这种方式将两个变量增加为“循环变量”是将来编写错误的一个方法。 (如果需要在每次循环迭代时更新两个变量,请将两者放在for(;;i++, j++)循环的最后一部分中。)