在C中查找主函数之外的数组大小

Find the size of array outside of main function in C

请查看下面的最小代码示例。我注意到 C 中的一个行为我找不到解释,所以我决定 post 在这里提问。

案例一

目标是在 main 中声明并初始化一个数组,然后将其传递给 function1。诀窍是在 function1 中找到该数组的元素数,而不必先在 main 中计算它,然后将其作为参数传递。那没有工作。

案例 2 和案例 3

这里,我计算了main中数组的元素个数,然后将其作为function2中的参数传入。效果很好。

问题

我的问题不一定是为什么这个计算数组中元素数量的过程在 main 以外的函数中不起作用;有点道理。

我的理解是数组只是指向第一个元素的指针(在本例中为 double *)。这种指针的大小(至少在我的计算机体系结构上)是 8 个字节。所以,sizeof(a) = 8。这也与任何一个元素的大小相同 (sizeof(a) == sizeof(a[0]))。因此,我将永远得到 numOfElements == 1.

我的问题是什么让 main 如此特别以至于它知道如何“正确地”回答我关于 sizeof(a) 的问题。特别是,由于我有一个包含 4 个双打的数组,main 会告诉我 sizeof(a) == 32,这正是我需要计算 numOfElements.

此外,为什么 GCC 会给我警告?它知道我不会得到我真正想要的值吗?

感谢任何让我增长知识的人。如果答案很明显,我深表歉意。也许,我是从有点过于抽象的角度来看这个问题,而不是分析这种行为所需要的。

代码

#include <stdio.h>

void function1(double a[])
{
    int numOfElements = sizeof(a) / sizeof(a[0]);

    printf("\n ---> Size of array in function1: %d\n", sizeof(a));

    // Some operations...
}

void function2(double a[], int numOfElements)
{
    // Some operations...
}

int main()
{
    double a[] = {1.32, 2, 5.52, 9.99};
    
    // Case 1
    function1(a);

    // Case 2
    int numOfElements = sizeof(a) / sizeof(a[0]);
    function2(a, numOfElements);
    
    // Case 3 - a more compact version of Case 2
    function2(a, sizeof(a) / sizeof(a[0]));

    printf("\n ---> Size of array in main: %d\n", sizeof(a));
    
    return 0;
}

输出和警告

这与 main() 无关,只要您不将数组作为函数参数传递就可以。

换句话说,arrays are not pointers and vice-versa。但是,当数组作为函数参数传递时,它会衰减到指向第一个元素的指针,因此在被调用函数内对接收到的参数使用 sizeof 不会产生预期的结果。

但是,在定义数组的同一个函数中,它仍然是一个数组,并且使用 sizeof returns 预期的大小。所以,它不是特定于 main(),而是关于是否将数组作为函数参数传递。