首页 >后端开发 >C++ >为什么'sizeof”在 C 函数内部和外部给出不同的数组大小?

为什么'sizeof”在 C 函数内部和外部给出不同的数组大小?

Susan Sarandon
Susan Sarandon原创
2024-12-19 10:51:09852浏览

Why Does `sizeof` Give Different Array Sizes Inside and Outside a C Function?

为什么 C 中函数内部的数组大小计算不同

将数组传递给函数时,C 会自动将数组衰减为指针到它的第一个元素。该指针携带第一个数组元素的地址,但不携带其大小。

考虑这个例子:

#include <stdio.h>

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

int main() {
    int point[3] = {50, 30, 12};

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

    test(point);

    return 0;
}

在 main 中,sizeof(point) 正确给出了整个数组的大小 ( 12 字节)。然而,在测试中,sizeof(arr) 产生 4 个字节(整数指针的大小),导致数组大小计算不正确(缺少一个元素)。

要解决此问题,必须显式指定数组大小作为单独的参数传递:

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

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

请注意,sizeof(point)/sizeof(point[0]) 适用于堆栈分配的数组,但不适用于动态分配的数组,因为它依赖于底层的衰减机制。

以上是为什么'sizeof”在 C 函数内部和外部给出不同的数组大小?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn