为什么从函数内部完成数组的大小计算不正确?

问题描述

当我在 main() 函数中使用此代码时,正确计算数组的大小(或长度):

#include <stdio.h>

int main(void)
{
    int arr[] = {2,5,9,8,4,1,2,5};
    int length = sizeof(arr) / sizeof(arr[0]);
    printf("The number of elements in the array is %d\n",length);
    return 0;
}

输出:

The number of elements in the array is 10

但是当我用一个函数做同样的事情时,输出是错误的:

#include <stdio.h>

int sizeTeller(int array[]);

int main(void)
{
    int arr[] = {2,5};
    printf("The number of elements in the array is %d\n",sizeTeller(arr));
    return 0;
}

int sizeTeller(int array[])
{
    int len;
    return (len = sizeof(array) / sizeof(array[0]));
}

输出:

The number of elements in the array is 2

你能向我解释一下为什么会这样吗?我更喜欢将所有代码保留在函数中,这就是为什么我在这里尝试相同但输出出错的原因。

解决方法

这是因为,与许多其他情况一样注意,当数组作为函数参数传递时,它们会衰减到指向数组第一个元素的指针。因此,在被调用的函数中,接收到的参数类型是指针,而不是数组。

所以,如果

int sizeTeller(int array[])
{
    int len;
    return (len = sizeof(array) / sizeof(array[0]));
}

相当于

int sizeTeller(int* array)
{
    int len;
    return (len = sizeof(array) / sizeof(array[0]));  // sizeof (int *) / sizeof (int)
}

解决方案:如果需要将数组作为函数参数传递,并且需要知道它的大小,则需要在调用者中计算大小并将其作为另一个参数传递给被调用函数.


注意:

引用 C11,第 6.3.2.1/P3 章

除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则表达式has type 'array of type' 被转换为类型为 'pointer to type' 的表达式,它指向数组对象的初始元素,而不是左值。 [....]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...