MST
星途 面试题库

面试题:C语言一维数组长度自动计算与指针的关联

已知在C语言中,数组名在某些情况下会被转换为指针。结合一维数组长度自动计算原理,分析当数组作为函数参数传递时,长度自动计算原理为何失效,如何在这种情况下获取数组的有效长度?
35.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
  1. 长度自动计算原理失效原因
    • 在C语言中,当数组作为函数参数传递时,数组名会退化为指针。例如有函数void func(int arr[]),实际上等同于void func(int *arr)
    • 一维数组长度自动计算原理是基于编译器在编译期知道数组定义时的大小,例如int arr[5] = {1, 2, 3, 4, 5};,编译器知道arr的长度是5。但当数组作为函数参数传递时,传递的只是指针,指针本身不包含数组长度的信息,所以长度自动计算原理失效。
  2. 获取数组有效长度的方法
    • 方法一:额外传递长度参数
      void func(int arr[], int len) {
          for (int i = 0; i < len; i++) {
              printf("%d ", arr[i]);
          }
      }
      int main() {
          int arr[5] = {1, 2, 3, 4, 5};
          func(arr, 5);
          return 0;
      }
      
    • 方法二:使用特殊标记 例如对于字符串,字符串以'\0'作为结束标记,这样可以通过遍历直到遇到'\0'来确定字符串(字符数组)的有效长度。对于一般数组,如果元素值有特定范围限制,可以约定一个特殊值作为结束标记。比如定义一个整数数组,元素值都在0到100之间,约定-1作为结束标记:
      void func(int arr[]) {
          int i = 0;
          while (arr[i] != -1) {
              printf("%d ", arr[i]);
              i++;
          }
      }
      int main() {
          int arr[] = {10, 20, 30, -1};
          func(arr);
          return 0;
      }
      
    • 方法三:使用结构体封装
      typedef struct {
          int data[100];
          int len;
      } MyArray;
      void func(MyArray arr) {
          for (int i = 0; i < arr.len; i++) {
              printf("%d ", arr.data[i]);
          }
      }
      int main() {
          MyArray arr = {.data = {1, 2, 3},.len = 3};
          func(arr);
          return 0;
      }