数组长度计数exception

计数返回不可预测的结果。 有时他们是对的。 有时候很奇怪。 谁能告诉我出了什么问题?

#include  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; } 

我认为你在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将是一个指针,因为编译器将函数参数中的数组转换为指向其第一个元素的指针。

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

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

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

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