可能重复:
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
为什么我会这样;如果我想将整个数据从一个数组转移到另一个数组,我该怎么办?
建议我如果有人知道。
答案 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。