C语言 函数数组参数的大小与定义时不相同的问题

C语言中,函数的数组参数在传递时会退化为指针,导致它们的大小与直接在 main 函数或其他地方声明的数组大小不同。也就是说,当一个数组作为参数传递给函数时,编译器会将数组退化为指针类型,因此在函数内部计算该参数的大小会得到指针的大小,而不是数组的实际大小。

1、数组参数会退化为指针的原因

C语言中,数组作为参数传递给函数时实际上传递的是指向数组首元素的指针,而不是整个数组。这样设计的原因是效率:传递指针比传递整个数组要高效得多。

因此,当你在函数中定义一个数组参数时,比如 int arr[] int arr[10],编译器将其视为 int* arr,即一个指向 int 的指针,而不是实际的数组。由于 arr 退化为指针,调用 sizeof(arr) 会返回指针的大小,而不是数组的大小。

#include <stdio.h>

void printArraySize(int arr[]) {
    printf("Size of array parameter in function: %zu bytes\n", sizeof(arr));
}

int main() {
    int arr[10];  // 定义一个大小为10的数组
    printf("Size of array in main: %zu bytes\n", sizeof(arr));

    printArraySize(arr);  // 传递数组到函数

    return 0;
}

2、函数中获取数组的实际大小的方法

由于数组在传递给函数时会退化为指针,如果我们需要在函数中知道数组的实际大小,可以通过传递数组的长度信息。

#include <stdio.h>

void printArray(int arr[], size_t size) {
    printf("Array size in function: %zu\n", size);
    for (size_t i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    size_t size = sizeof(arr) / sizeof(arr[0]);  // 计算数组元素个数

    printf("Array size in main: %zu\n", size);
    printArray(arr, size);  // 将数组和大小传递给函数

    return 0;
}

3、函数中使用指针加长度的方式

使用指针加长度的方式传递数组时,我们将数组的首地址和数组的长度一同传递给函数。这样,函数可以使用指针来操作数组,并根据传入的长度来遍历数组。

#include <stdio.h>

void printArray(int *arr, int length) {
    for (int i = 0; i < length; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int length = sizeof(arr) / sizeof(arr[0]); // 计算数组长度

    printArray(arr, length); // 传递数组指针和长度
    return 0;
}

推荐阅读
cjavapy编程之路首页