数组长度计数异常

时间:2012-02-15 03:04:02

标签: c

计数正在返回不可预测的结果。有时他们是对的。有时候很奇怪。任何人都可以告诉我出了什么问题?

#include <stdio.h>
int len(int[]);

int main (int argc, const char * argv[])
{
    int a[]={1,2,3,4,5,6,7,8};
    int* i = a;
    printf("length is %d",(len(i)));
    return 0;
}

int len(int* a){
    int count = 0;
    for (; *a!='\0'; a++) {
        count++;
    }
    return count; 
}

4 个答案:

答案 0 :(得分:7)

除非你把数组放在那里,否则数组末尾不会有零!使用字符串定义的文字字符数组确实具有这样的标记值,但它们是特殊的;其他数组没有等价物。

您尝试编写的len()函数无法为C中的常规数组编写 - 如果不使用(未记录的平台),则无法确定动态数组的大小特定的)内存分配器的内部。如果为您的应用程序执行此操作非常重要,那么只有在您可以自己明确地在每个数组的末尾添加零时才能执行此操作。

答案 1 :(得分:3)

我认为你在C字符串(char的数组)和其他数组之间感到困惑。 C字符串以空字符('\0')终止是一种约定,但并非所有数组(甚至char数组)都以这种方式终止。

一般约定是在某处存储数组的长度,或者在数组的末尾使用sentinel值。此值应该是不会出现在数组中的值 - 例如,字符串中为'\0',或者为正整数数组中的-1

另外,如果您知道a是一个int数组(而不是指向int数组的指针),那么您可以使用:

size_t length = sizeof(a) / sizeof(a[0]);

所以你可以这样做:

int a[] = {1,2,3,4,5,6,7,8};
size_t length = sizeof(a) / sizeof(a[0]); 

// In this case, sizeof(a[0]) 
// is the same as sizeof(int), because it's an int array.

但你不能这样做:

int *a = malloc(sizeof(int) * 10);
size_t length = sizeof(a) / sizeof(a[0]); // WRONG! 

最后一个例子将编译,但答案是错误的,因为你得到了指向数组的指针的大小,而不是数组的大小。

请注意,您也无法使用此sizeof来读取已传递给函数的数组的大小。是否声明函数len(int *a)len(int a[]) - a将是一个指针并不重要,因为编译器将函数参数中的数组转换为指向其第一个元素的指针。 / p>

答案 2 :(得分:1)

你无法计算那样的数组。只有字符串以空值终止。如果您希望它可靠地工作,则需要向包含'\ 0'的数组添加其他元素。但请务必记住,考虑到你的长度不会超过真正的长度,因为'\ 0'

答案 3 :(得分:1)

与字符串不同,普通数组不以空字节0x00终止。字符串使用它的原因是因为数组没有长度概念;数组只是连续的内存块,由你来跟踪数组的长度。