1

我试过了(sizeof(array)/sizeof(array[0]))。没用。我写了一个简单的函数:

int length(int array[]){
    int i=0;
    while(array[i]) i++;
    return i;
}

前一分钟工作,下一分钟没有工作。

有人请帮忙!我使用 Xcode 作为 IDE

4

5 回答 5

3

数组的长度不是 C 中数组的一部分,因此在将数组作为参数传递给函数时,您也应该将其长度作为参数传递。这是一个例子:

#define ARRLEN(a) (sizeof(a)/sizeof (a)[0]) /* a must be an array, not a pointer */

void printarray(int* a, int alen)
{
    int i;
    for (i = 0; i < alen; i++)
        printf("%d\n", a[i]);
}

main()
{
    int a[] = { 3, 4, 5 };
    printarray(a, ARRLEN(a));
    return 0;
}

但是,如果您的数组被定义为始终以非正常数据的哨兵结尾,那么您可以遍历元素直到遇到哨兵。例如,

void printstrings(char** a)
{
    int i;
    for (i = 0; a[i]; i++)
        printf("%s\n", a[i]);
}

main()
{
    char* a[] = { "This", "should", "work.", NULL };
    printstrings(a);
    return 0;
}
于 2012-11-15T05:41:38.360 回答
1

将数组传递给函数与将指针传递给数组相同。所以sizeof(array)/sizeof(array[0])不起作用。

您可以定义一个全局宏:

#define A_LEN(a) (sizeof(a)/sizeof(a[0]))
于 2012-11-15T05:34:40.087 回答
0

请参阅当数组是函数的参数时,为什么 sizeof 不能正确报告数组的大小?从 comp.lang.c FAQ 了解为什么该sizeof方法不起作用。您可能应该阅读有关数组的整个部分

关于您的length函数,您的“简单”函数只有在您的数组碰巧具有以0. 它不适用于任意数组。当一个数组已经衰减为 C 中的一个指针时,没有办法恢复数组的大小,必须传递数组长度。(即使是 C 标准库中的函数也不能幸免;gets不接受指定其目标缓冲区长度的参数,因此众所周知它是不安全的。它不可能确定目标缓冲区的大小,因此无法防止缓冲区溢出。)

于 2012-11-15T06:15:40.023 回答
0

尝试这个

main()
{
int a[10] ;
printf("%d\n", sizeof(a)/sizeof(int) ) ;
}

output : 10 
于 2012-11-15T06:02:05.747 回答
0

有几种方法可以获取函数内部数组的长度(可以在同一个文件中,也可以在不同的源文件中)

  1. 将数组长度作为单独的参数传递。
  2. 将数组长度设为全局extern,以便函数可以直接访问全局数据
于 2012-11-15T05:55:57.783 回答