2012-11-15 20 views
1

我试过(sizeof(array)/sizeof(array[0]))。没有工作。 我写了一个简单的函数:C中的所有数组长度方法都不起作用

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

曾为一分钟后,没有工作的下一步。

有人请帮忙!我将Xcode用作IDE

+6

这应该可以帮助你:http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c。 'sizeof'不起作用,因为它被传递给一个函数,而另一个不是因为它是用于空终止数组(通常是字符串)。 – chris

+0

@chris尽管网址,链接是关于C++的问题,而不是C. –

+0

@JimBalter,True,但对C++语法有一个基本的了解,几乎所有对C转换的小东西都是有效的,比如'new []' - >'malloc'。如果我能找到一个C版本,我很乐意使用它。 – chris

回答

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; 
} 
+0

我试图得到长度,所以我不能通过它。此外,我从另一个调用此功能。 – benwaffle

+2

你不能“得到”长度,你必须已经知道它......正在调用这个函数的函数知道它,或者它的调用者会这样做,或者它......因为你定义或分配的行的某处数组,并且长度在该点是已知的。请相信我,自1977年以来我一直在写C语言,我的回答很合理。 –

+0

我创建了这样的数组: int array [] = {}; – benwaffle

1

将数组传递到函数中与将指针传递给数组的方式相同。 因此sizeof(array)/sizeof(array[0])不起作用。

你可以定义一个全局宏:

#define A_LEN(a) (sizeof(a)/sizeof(a[0])) 
+0

该宏也不起作用。 (我指出这是因为新手可能不明白。) –

+0

@JimBalter感谢您的评论。稍后会更新我的答案。 –

0

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

  1. 传递数组长度作为一个单独的参数。
  2. 化妆数组长度为全球extern,这样的功能可以直接访问全球数据
+0

第三个是有点冗长,但不需要通过的大小,也没有必要使全球或创建宏 – Omkant

+0

还编译与'-std = c99' – Omkant

+0

主obj'不同于obj'在函数,这是未初始化的。你不能奇迹般地把长度变成func;您需要(1)或(2),或者包含长度和指向数组的指针(以及每种类型的结构)的结构。 –

0

试试这个

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

output : 10 
+0

OP需要在声明数组之外的函数中使用长度(OP在我的回答的评论中声明了这一点)。 –

0

Why doesn't sizeof properly report the size of an array when the array is a parameter to a function?从comp.lang.c常见问题理解为什么sizeof方法不起作用。你可能应该阅读entire section on arrays

关于你length功能,你的“简单”的功能,可以工作只有如果你的阵列碰巧有语义,它终止与拥有0价值的元素。它不适用于任意数组。当数组已经衰减为C中的指针时,无法恢复数组的大小,并且您必须沿着数组长度传递。 (即使C标准库中的函数也不是免疫的; gets没有指定其目标缓冲区的长度的参数,因此它是非常不安全的,它是不可能的它确定目标缓冲区的大小,因此它不能防止缓冲区溢出。)

相关问题