MST

星途 面试题库

面试题:C语言函数参数中数组名传递机制基础应用

编写一个C语言函数,函数接收一个数组作为参数。在函数内部尝试获取数组的长度,观察结果并解释为什么会这样。请写出完整代码并加以注释说明。
41.1万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义一个函数,接收一个数组作为参数
void getArrayLength(int arr[]) {
    // 在函数内部,使用 sizeof 操作符获取数组长度
    // 这里的 arr 实际上已经退化为一个指针,所以 sizeof(arr) 获取的是指针的大小
    size_t length = sizeof(arr) / sizeof(arr[0]);
    printf("在函数内部获取的数组长度(错误值): %zu\n", length);
}

int main() {
    int myArray[] = {1, 2, 3, 4, 5};
    // 在 main 函数中获取数组的真实长度
    size_t trueLength = sizeof(myArray) / sizeof(myArray[0]);
    printf("数组的真实长度: %zu\n", trueLength);

    getArrayLength(myArray);

    return 0;
}

在C语言中,当数组作为函数参数传递时,它会退化为指针。所以在 getArrayLength 函数内部,sizeof(arr) 获取的是指针的大小(通常在64位系统上为8字节,32位系统上为4字节),而不是数组的真实长度。因此通过 sizeof(arr) / sizeof(arr[0]) 得到的结果并不是数组的真实长度。而在 main 函数中,直接对数组 myArray 使用 sizeof 可以得到数组的真实字节数,再除以单个元素的字节数,就能得到数组的真实长度。