如何在C中获取数组的长度? “sizeof”是一个解决方案吗?

时间:2012-02-23 12:26:39

标签: c

  

可能重复:
  Sizeof an array in the C programming language?
  Why does a C-Array have a wrong sizeof() value when it's passed to a function?

请参阅以下代码,并建议我使用“ sizeof ”关键字时有什么不同:

#include<stdio.h>
#include<conio.h>
void show(int ar[]);
void main()
{
    int arr[]={1,2,3,4,5};
    clrscr();
    printf("Length: %d\n",sizeof(arr));
    printf("Length: %d\n",sizeof(arr)/sizeof(int));
    show(arr);
    getch();
}
void show(int ar[])
{
   printf("Length: %d", sizeof(ar));
   printf("Length: %d", sizeof(ar)/sizeof(int));
}

但输出是这样的:

  

输出是:

     

长度:10

     

长度:5

     

长度:2

     

长度:1

为什么我会这样;如果我想将整个数据从一个数组转移到另一个数组,我该怎么办?

建议我如果有人知道。

3 个答案:

答案 0 :(得分:62)

数组衰减到函数调用中的指针。无法计算仅以任何方式表示为指针的数组的大小,包括使用sizeof

您必须添加一个显式参数:

void show(int *data, size_t count);

在通话中,您可以使用sizeof来计算实际数组的元素数量:

int arr[] = { 1,2,3,4,5 };

show(arr, sizeof arr / sizeof *arr);

请注意sizeof为您提供char单位的大小,这就是为什么需要除以基本为sizeof (int)的值,或者您得到的值太高了

另请注意,作为一个兴趣点和清洁度,sizeof 不是一个功能。仅当参数是类型名称时才需要括号,因为参数则是类似于类似表达式的表达式(例如sizeof (int))。通过对数据执行sizeof,您通常可以在不指定实际类型的情况下离开。

答案 1 :(得分:3)

这就是为什么在编写一个接受数组的函数时会声明两个参数的原因。一个是指向数组的指针,另一个是定义数组的大小。

答案 2 :(得分:1)

show()获取存储在2个字节上的数组的地址。把它想象为int * ar。