在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()
,而是关于是否将数组作为函数参数传递。
请查看下面的最小代码示例。我注意到 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()
,而是关于是否将数组作为函数参数传递。