为什么C数组在传递给函数时具有错误的sizeof()值?

为什么C数组在传递给函数时具有错误的sizeof()值?,c,arrays,function,sizeof,C,Arrays,Function,Sizeof,完整示例: #include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); printf("%d\n", arrSize); // 2 (wrong?!) } int main (int argc, const char * argv[]) { int point[3] = {50, 30, 12}; int arrSize

完整示例:

#include <stdio.h>

void test(int arr[]) {
    int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
    printf("%d\n", arrSize); // 2 (wrong?!)
}

int main (int argc, const char * argv[]) {
    int point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0]));
    printf("%d\n", arrSize); // 3 (correct :-) )

    test(point);

    return 0;
}

在将其传递给函数之前,sizeof会给出正确的值。在函数中的完全相同的数组上执行完全相同的操作会产生奇怪的结果。缺少一个元素。为什么?

因为在传递它时,实际上只传递指向数组的指针


你的问题也得到了回答。问题6.21.

因为sizeof并没有告诉您C中数组的大小。它做了一些完全不同的事情


因为数组作为函数参数传递时指向指针,所以对于32位和64位平台,sizeof分别为4和8。

当您将数组传递到C中的函数中时,数组将衰减为指向其第一个元素的指针。在参数上使用sizeof时,采用的是指针的大小,而不是数组本身

如果需要函数了解数组的大小,则应将其作为单独的参数传递:

void test(int arr[], size_t elems) {
   /* ... */
}

int main(int argc, const char * argv[]) {
   int point[3] = {50, 30, 12};
   /* ... */
   test(point, sizeof(point)/sizeof(point[0]));
   /* ... */
}

还请注意,出于类似的原因,将sizeof作为指针,sizeofpoint/sizeofpoint[0]技巧不适用于动态分配的数组,只适用于在堆栈上分配的数组。

此外,了解sizeof是在编译时计算的,这一点很重要。既然如此,根据传入的内容在测试中期望不同的输出是没有意义的。函数编译时进行了计算,

,因为在C、C++和Objto-C中,函数实际上不能有数组参数。它们只能具有看起来像数组参数的参数,但它们不是。以你为例,

void test(int arr[])
编译器看到有一个看起来像int数组的参数,它用指向int的指针替换该参数。因此,您编写的函数与

void test (int* arr)

因此,在函数sizeof arr中,将给出指向int的指针的大小。

如果仔细查看示例,您会发现我没有使用sizeof直接获取数组中的元素数。。。sizeof应该告诉我为阵列保留了多少内存。。。事实上,当一个元素的大小已知时,这应该与其中有多少个元素相匹配。还是我遗漏了什么?我会改正的。但是如上所述,小心指针。它们告诉你它们的大小,而不是你所指向的类型的大小。挑剔一点:它是指向数组中第一个被传递的元素的指针。值相同,但类型不同。