获取传递给C函数的数组长度

时间:2014-03-14 11:03:55

标签: c arrays pointers

如何将数组传递给函数并保留有关其长度的信息而不单独传递长度?

[自我Q& A - 比我下面更好的答案]

4 个答案:

答案 0 :(得分:6)

AFAIK如果将数组作为指针传递,则无法知道其在C中的长度。长度必须由调用者提供。

答案 1 :(得分:6)

在C中,数组不能完全传递给函数,因此不可能。传递数组名称时,它会衰减到指向第一个元素的指针。使用sizeof运算符不会以任何方式帮助您,因为它会为您提供指针的大小。

您可以将数组大小传递给函数,也可以在数组末尾使用 sentinel 值。

#include <stdio.h>

int size(int *a)
{
    int count = 0;
    while(*a++ != -1)
        count++;
    return count + 1;
}
int main(void)
{
    signed int a[] = { 3, 5, 7, 9, 10, -1};

    printf("size of array is: %d\n", size(a));
}

答案 2 :(得分:3)

总结:

实际工作的唯一两种方法。

答案 3 :(得分:0)

你可以像许多人一样单独传递长度。另一种可能不切实际的方法是你可以将一个指针传递给数组本身并从那里检索长度。

编辑#2:删除了带有全局变量的版本,因为这是不好的做法。我正在重新发布旧的解决方案,虽然这种解决方案不那么乏味且不那么危险。

编辑#3:用至少显示其原理的内容替换原文。

#include <stdio.h>

void printArray(char (*p)[10]);

int main(void){

    char p[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    printArray(&p);
    return 0;

}

void printArray(char (*p)[10]){

    for(int i = 0; i < sizeof (*p); i++)
        printf("%d ", (*p)[i]);
    printf("\n");
}

输出:

0 1 2 3 4 5 6 7 8 9