【问题标题】:C: pass array to a function and iterate over in recipient functionC:将数组传递给函数并在接收函数中迭代
【发布时间】:2015-02-28 03:31:38
【问题描述】:

我想将一个数组传递给 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)。谢谢

【问题讨论】:

标签: c arrays loops parameter-passing


【解决方案1】:

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

【讨论】:

  • 比这更简单。函数参数a一个指针。因此sizeof(a) 是该指针的大小。
【解决方案2】:

因为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]));

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

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

【讨论】:

  • 谢谢,我会接受这个作为答案:) ...数组未正确初始化,因为它只是用于试用,而不是生产代码:)
  • 如果您使用sizeof(a) / sizeof(a[0]),为什么还需要count 参数?
  • @mireazma 请阅读sizeof 运算符。数组没问题,但指针只给出指针的大小。没有办法在 C 中动态确定数组的元素数量,因为数组直接存储在内存中,没有任何元数据。
  • @IharobAlAsimi 完全同意:如果a 是一个数组,sizeof(a) 将有意义。但由于a 是一个指针,无论您如何将其指定为参数类型,sizeof(a) 将始终为 64 位 SO 返回 8。 sizeof(a[0]) 总是返回 4(实际上)。为什么要分他们?我认为您的意思是一回事,并在代码中写了其他内容。
  • 你有零保证它会返回 8 或 4。所以你必须做安全的事情,这样你的代码才能在任何平台上工作。
【解决方案3】:

函数原型是

int funct(int * a)

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

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

【讨论】:

  • sizeof(a) 是指针的大小,因为a 是指针。
  • @juanchopanza 是的,绝对的。
  • 我的观点是数组衰减与sizeof(a) 给出指针大小的原因无关。
  • @juanchopanza 明白了。重新措辞澄清。现在可以了吗?
  • @juanchopanza 谢谢你,先生。 :-)
猜你喜欢
  • 1970-01-01
  • 2016-02-07
  • 1970-01-01
  • 2013-06-26
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
相关资源
最近更新 更多