为什么我的 A[] 函数参数的大小为 8 个字节而不是 4 个字节?

Why does my A[] function argument have size 8 bytes instead of 4?

我正在从 freeCodeCamp.org 学习 C 指针,我被困在数组指针上,因为函数参数跟在后面。

讲师的代码是这样的

int SumOfElement(int A[]) {
    int i, sum = 0;
    int size = sizeof(A)/sizeof(A[0]);
    printf("SOE - Size of A = %d, size of A[0] = %d", sizeof(A), sizeof(A[0]));
    for(i = 0; i<size; i++)
    { sum += A[i];}
    return sum;
}

int main() {
    int A[]= {1,2,3,4,5};
    int total = SumOfElements(A);
    printf("Sum of elements %d\n",total);
    printf("Main - Size of A = %d, size of A[0] %d",sizeof(A),sizeof(A[0]));
}

他的结果(来自感兴趣的部分)是:

SOE - Size of A = 4
Main - Size of A = 20

我明白为什么会这样。但是在我的代码中,当我尝试 运行 类似的代码时,我从函数 sizeof(A) 内部打印得到 8

int myFunc(int a[]) {
    printf("Size of a[] inside function is %d\n", sizeof(a));
    return a;
}

int main(){
    int a[] = {1, 2, 3, 4, 5};
    myFunc(a); // Result is 8
    printf("Size of a[] in main function is %d\n", sizeof(a)); // Result is 20
    return 0;
}

int A[] 是一个数组声明,但由于它是函数参数列表的一部分,它被隐式调整为指向该数组第一个元素的指针。

int SumOfElement(int A[]) 100% 等同于 int SumOfElement(int* A).

因此在该函数内部执行 sizeof A 是没有意义的,因为这样做总是会给你指针的大小。在 32 位系统上通常为 4 个字节,但在 64 位系统上通常为 8 个字节。

同理,int size = sizeof(A)/sizeof(A[0]);也是废话。当 A 是一个已经衰减为指针的数组时,您无法计算这样的数组大小。这给你一个指针的大小除以 int.

的大小

为了让这个函数有意义,它可能应该有一个单独的 size 参数。