#include<stdio.h>
void length(int arr[])
{
int len=sizeof(arr)/sizeof(arr[0]);
printf("%d",len);
}
main()
{
int arr[]={4,5,6,3,21,9,3,8};
length(arr);
}
在这段代码中答案总是2.我无法理解为什么。总是需要发送大小。
答案 0 :(得分:1)
总是2,因为arr
是一个指针而你是64位系统。并且int
在您的系统上是32位。将它们分开,你得到2。
你根本无法获得这样的数组的长度,因为它在传递给函数时会衰减到指针。您需要显式传递大小,或使用sentinel指定列表的末尾(如以空字符结尾的字符串)。
答案 1 :(得分:1)
在C中,你不能将整个数组传递给被调用的函数,因为在这种情况下它可能需要很大的堆栈空间,因为据我所知,传递给函数的参数存储在堆栈中。
因此,当您尝试将数组传递给函数时,数组名称会衰减为指向数组第一个元素的指针,因为数组存储在连续的内存位置,因此您只需要知道第一个元素的地址。
正如 @John Zwinck 已经指出的那样,你总是得到2
输出的确切原因可能是你在64-bit
系统上。
在64位系统/编译器上,指针的大小为8 bytes
(仅仅因为系统可以访问2^64
个地址,因此需要8个字节来存储它们)并且大小为{{1是} int
。
答案 2 :(得分:1)
是的,有必要始终发送大小,sizeof(arr)
报告指针的大小:
Q :当数组是函数的参数时,为什么sizeof不能正确报告数组的大小?我有一个测试程序
f(char a [10]){int i = sizeof(a); printf(“%d \ n”,i); }
它打印4而不是10。
A :编译器假装数组参数被声明为指针(在示例中,为char * a;请参阅问题6.4),并且 sizeof报告指针的大小。另见问题1.24和 7.28。
参考文献:H&amp; S Sec。 7.5.2 p。 195
http://c-faq.com/aryptr/aryparmsize.html
或者您可以使用包含大小的额外第一个元素:
#include <stdio.h>
void length(int arr[])
{
int len = arr[-1];
printf("%d", len);
}
int main(void)
{
int arr[]={0,4,5,6,3,21,9,3,8}; /* Note first element = 0 */
arr[0] = sizeof(arr) / sizeof(arr[0]) - 1;
length(arr + 1);
return 0;
}