面试题答案
一键面试- 长度自动计算原理失效原因:
- 在C语言中,当数组作为函数参数传递时,数组名会退化为指针。例如有函数
void func(int arr[])
,实际上等同于void func(int *arr)
。 - 一维数组长度自动计算原理是基于编译器在编译期知道数组定义时的大小,例如
int arr[5] = {1, 2, 3, 4, 5};
,编译器知道arr
的长度是5。但当数组作为函数参数传递时,传递的只是指针,指针本身不包含数组长度的信息,所以长度自动计算原理失效。
- 在C语言中,当数组作为函数参数传递时,数组名会退化为指针。例如有函数
- 获取数组有效长度的方法:
- 方法一:额外传递长度参数
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; }
- 方法一:额外传递长度参数