C 阵列长度计数异常

C 阵列长度计数异常,c,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 co

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

#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; 
}
#包括
int len(int[]);
int main(int argc,const char*argv[]
{
int a[]={1,2,3,4,5,6,7,8};
int*i=a;
printf(“长度为%d”,(len(i));
返回0;
}
整数长度(整数*a){
整数计数=0;
对于(;*a!='\0';a++){
计数++;
}
返回计数;
}

除非将一个零放在数组末尾,否则数组末尾不会有零!使用字符串定义的文字字符数组确实有这样一个哨兵值,但它们是特殊的;其他数组没有等效的


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

您不能这样计算数组。只有字符串以null结尾。如果希望它可靠地工作,则需要向数组中添加一个包含“\0”的附加元素。但是一定要记住,你的长度不会比真实长度大一倍,因为“\0”

我认为你把C字符串(字符数组)和其他数组搞混了。按照惯例,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
都将是指针,因为编译器将函数参数中的数组转换为指向其第一个元素的指针。

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

是的-您试图做的事情本身就是有缺陷的。在C语言中不能计算数组长度。如果你有一个实际数组,你可以使用
#define ARRLEN(arr)(sizeof(arr)/sizeof(*arr))
但它对指针不起作用,因此对传递给函数的数组不起作用。
int
表示长度*颤抖*(当你把它固定到<代码> SsieZiT<<代码>时,考虑将<代码> SIZEOF(int) > <代码> SIZEOF(A(0))< /代码>。我用
int
而不是
a[0]
来说明计算是什么,但我想我应该用文字来表达。更新:)