如果我们在将数组传递给函数后尝试确定数组的大小,实际会发生什么

时间:2014-10-10 09:07:51

标签: c arrays sizeof

#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.我无法理解为什么。总是需要发送大小。

3 个答案:

答案 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;
}