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

Why the size of array is calculated incorrectly when done from inside a function?

提问人:Neeraj-Kumar-Coder 提问时间:1/4/2021 最后编辑:Sourav GhoshNeeraj-Kumar-Coder 更新时间:1/4/2021 访问量:266

问:

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

#include <stdio.h>

int main(void)
{
    int arr[] = {2, 5, 9, 8, 4, 5, 1, 2, 8, 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, 9, 8, 4, 5, 1, 2, 8, 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

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

数组 C 函数 指针 sizeof

评论


答:

3赞 Sourav Ghosh 1/4/2021 #1

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

所以,如果

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)
}

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


注意:

引用,第6.3.2.1/P3章C11

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

评论

0赞 Neeraj-Kumar-Coder 1/4/2021
这是否意味着 which is in 正在计算完整数组的大小。我的意思是也是指向数组第一个元素的指针,所以为什么它没有像在 中那样返回指针的大小。sizeof(arr)main()arrintsizeof(int*)
0赞 Sourav Ghosh 1/4/2021
@Neeraj-Kumar-Coder 不,请注意“像许多其他情况一样”部分,它并非“总是”。我将稍微扩展答案以澄清。
0赞 Neeraj-Kumar-Coder 1/4/2021
我明白了你的意思,也明白了输出错误的原因。但是只要向我澄清一下,作为指向数组第一个元素的指针(如在函数中),那么为什么不返回,这是指向 int 的指针的大小。arrmain()sizeof(arr)8 bytes
0赞 Sourav Ghosh 1/4/2021
你读过最新的编辑吗?它特别指出,除了场景外,操作员就是其中之一。sizeof