1、sizeof 在传递数组时不返回实际大小的原因
C语言中,当数组被传递到函数时,它会退化为一个指向数组第一个元素的指针。也就是函数接收到的并不是数组本身,而是一个指向数组第一个元素的指针。
#include <stdio.h>
void printSize(int arr[]) {
printf("Inside function, sizeof(arr): %zu\n", sizeof(arr));
}
int main() {
int arr[10];
printf("In main, sizeof(arr): %zu\n", sizeof(arr));
printSize(arr);
return 0;
}
2、数组退化
当将一个数组传递给函数时,它会退化为一个指向数组第一个元素的指针,在 main
中,int arr[10]
是一个数组。在 printSize
中,int arr[]
被解释为 int *
,因此 sizeof(arr)
计算的是指针的大小,而不是数组的大小。
#include <stdio.h>
void printArraySize(int arr[]) {
// 数组退化为指针,此时 sizeof(arr) 是指针的大小
printf("In function, sizeof(arr): %zu\n", sizeof(arr));
}
void printArraySizeUsingPointer(int *arr) {
// 同样的,使用指针作为参数也是指针的大小
printf("In function, sizeof(arr): %zu\n", sizeof(arr));
}
int main() {
int array[10]; // 定义一个数组
printf("In main, sizeof(array): %zu\n", sizeof(array)); // 输出整个数组的大小
printArraySize(array); // 传递数组到函数
printArraySizeUsingPointer(array);
return 0;
}
3、获取实际的数组大小的方法
如需要在函数中获取数组的实际大小,必须通过额外的参数将数组的大小显式传递给函数。
#include <stdio.h>
void printSize(int arr[], size_t size) {
printf("Array size is: %zu\n", size);
}
int main() {
int arr[10];
printSize(arr, sizeof(arr) / sizeof(arr[0])); // 显式传递数组大小
return 0;
}
4、在 C++17 及更高版本中使用 std::size
在现代 C++(C++17 及之后),可以使用 头文件中的 std::size
来获取数组的大小,从而避免手动计算。
#include <iostream>
#include <iterator>
using namespace std;
void printSize(int arr[], size_t size) {
cout << "Array size is: " << size << endl;
}
int main() {
int arr[10];
printSize(arr, size(arr)); // 使用 size 获取数组大小
return 0;
}
5、使用模板自动推导数组大小(C++ 特性)
C++ 中,可以使用模板来推导数组的大小,而无需显式传递数组大小。这种方法只适用于真正的数组,而不适用于退化后的指针。
#include<iostream>
using namespace std;
template <typename T, size_t N>
void printSize(T (&arr)[N]) { // 使用引用传递数组,保留数组大小信息
cout << "Array size is: " << N << endl;
}
int main() {
int arr[10];
printSize(arr); // 无需显式传递数组大小
return 0;
}