sizeof运算符返回指针的大小而不是数组

时间:2014-08-12 08:55:58

标签: c sizeof

当我运行以下代码时,我有点困惑:

int Maxi(int A[])
{
    return sizeof(A)/sizeof(A[0]);
}

int main()
{
    int A[5] = {1,2,3,4,5};
    print("%d \n", Maxi(A));
    return 0;
}

我得到结果2sizeof(A)似乎是8,这是指针的大小。我知道这可能不是一个值得问的问题,但我必须错过一些东西,我现在无法理解。

但如果我这样做:

int main()
{
    int A[5] = {1,2,3,4,5};
    print("%d \n", sizeof(A)/sizeof(A[0]));
    return 0;
}

那好吧,我认为这与功能之间的价值传递有关,但我很困惑。

谢谢!

3 个答案:

答案 0 :(得分:1)

将数组作为参数传递给函数后,将数组decays传递给指针。因此,它的大小计算为8(我猜测你是在64位系统上)。 sizeof(A[0])是4(一个整数),因此它是你的2。

它起作用的原因'在main内,编译器能够直接从上面的静态初始化计算大小。

答案 1 :(得分:1)

您不能将整数数组传递给具有数组名称的另一个函数。

int Maxi(int A[])

等于此

int Maxi(int *A) 

语法。

因此,无论何时将数组传递给另一个函数,都应该传递该数组中的元素数量。

int Maxi(int A[], int elements)
//....
// call should be
print("%d \n", Maxi(A, elements));

否则它将数组视为整数指针,它将返回指针的大小。

答案 2 :(得分:0)

当你将一个数组传递给函数时,在被调用函数Maxi中,在这种情况下,Maxi的参数声明为int A [],与int * A相同

int Maxi(int A[])

相当于:

int Maxi(int *A)

因此,传递的数组被视为被调用函数中的指针,指针的大小当然不是Maxi中数组的大小,因此,大小必须明确传递,如下所示:

int Maxi(int A[], int sz)
{
    return sz/sizeof(A[0]);
}

int main()
{
    int A[5] = {1,2,3,4,5};
    printf("%d \n", Maxi(A, sizeof(A)));
    return 0;
}

这将根据需要输出5