C:将数组传递给函数并在接收函数中迭代

时间:2015-01-01 13:51:14

标签: c arrays loops parameter-passing

我想将数组传递给C中的函数并迭代它。我有这段代码:

#include <stdio.h>

int funct(int * a);

int main(int argc, char ** argv){
    int a[5] = {0};
    int b[5] = {1, 1};

    printf("Size of cache: %d\n", sizeof(a));
    printf("Array values:\n");
    printf("Numb of elments in a[]: %d\n", (sizeof(a) / sizeof(a[0])));

    for(int i = 0; i < (sizeof(a) / sizeof(a[0])); i++){
        printf("for loop\n");
        printf("%d\n", a[i]);
    }
    printf("\n");

    printf("Size of cache: %d\n", sizeof(b));
    printf("Array values:\n");
    printf("Numb of elments in a[]: %d\n", (sizeof(b) / sizeof(b[0])));

    for(int i = 0; i < (sizeof(b) / sizeof(b[0])); i++){
        printf("for loop\n");
        printf("%d\n", b[i]);
    }
    printf("\n");

    funct(a);
    funct(b);

    return 0;
}

int funct(int * a){

    printf("Size of cache: %d\n", sizeof(a));
    printf("Numb of elements in a[]: %d\n", (sizeof(a) / sizeof(a[0])));
    printf("Array values:\n");

    for(int i = 0; i < (sizeof(a) / sizeof(a[0])); i++){
        printf("sizeof(a): %d\n",sizeof(a));
        printf("sizeof(a[0]): %d\n",sizeof(a[0]));
        printf("for loop\n");
        printf("%d\n", a[i]);
    }
    printf("\n");

    return 0;
}

结果是:

Size of cache: 20
Array values:
Numb of elments in a[]: 5
for loop
0
for loop
0
for loop
0
for loop
0
for loop
0

Size of cache: 20
Array values:
Numb of elments in a[]: 5
for loop
1
for loop
1
for loop
0
for loop
0
for loop
0

Size of cache: 4
Numb of elements in a[]: 1
Array values:
sizeof(a): 4
sizeof(a[0]): 4
for loop
0

Size of cache: 4
Numb of elements in a[]: 1
Array values:
sizeof(a): 4
sizeof(a[0]): 4
for loop
1

请解释为什么我不能在函数内迭代数组 - 我做错了什么(i)以及如何正确地解决它(ii)。感谢

3 个答案:

答案 0 :(得分:4)

因为sizeof运算符给出了指针的大小,而不是数组中的元素数,所以你应该像这样编写函数

int funct(int * a, int count){

    printf("Size of cache: %d\n", sizeof(a));
    printf("Numb of elements in a[]: %d\n", (sizeof(a) / sizeof(a[0])));
    printf("Array values:\n");

    for(int i = 0; i < count; i++){
        printf("sizeof(a): %d\n",sizeof(a));
        printf("sizeof(a[0]): %d\n",sizeof(a[0]));
        printf("for loop\n");
        printf("%d\n", a[i]);
    }
    printf("\n");

    return 0;
}

然后在main()函数调用

funct(a, sizeof(a) / sizeof(a[0]));
funct(b, sizeof(b) / sizeof(b[0]));

你无法获得指针所指向的元素数,因此唯一的方法是将其作为函数参数与数组一起传递。

另请注意,您没有正确初始化数组,并且在尝试打印数组元素时这将是未定义的行为。

答案 1 :(得分:3)

sizeof(a)将给出指针的大小而不是传递数组,因为a是函数funct中的指针。

答案 2 :(得分:3)

函数原型是

int funct(int * a)

其中,aint *。然后,当您从a传递数组main()时,它将衰减funct()中的指针。因此,sizeof(a)中的funct()只会给出指针的大小。

要满足您的要求,您还必须从main()传递大小。