1、使用 sizeof 获取数组大小
如直接操作数组,则可以通过 sizeof
操作符获取数组的大小,如下,
#include <stdio.h>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
size_t size = sizeof(arr) / sizeof(arr[0]);
printf("Array size: %zu\n", size); // 输出 5
return 0;
}
2、指针无法通过 sizeof 获取数组大小
如果将数组传递给一个函数时,数组会衰退(decay)为指向其第一个元素的指针。此时,sizeof
操作符仅能返回指针本身的大小,而不是数组的大小。
#include <stdio.h>
void printSize(int *ptr) {
size_t size = sizeof(ptr) / sizeof(ptr[0]);
printf("Pointer size: %zu\n", size); // 输出 1 或其他不期望的结果
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
printSize(arr);
return 0;
}
3、传递数组的大小
由于指针无法知道数组的大小,通常的做法是显式地传递数组的大小作为参数。
#include <stdio.h>
void printSize(int *ptr, size_t size) {
printf("Array size: %zu\n", size);
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
size_t size = sizeof(arr) / sizeof(arr[0]); // 在调用前计算数组大小
printSize(arr, size);
return 0;
}
4、使用动态数组时
如果数组是动态分配的(例如使用 malloc()
),就不能使用 sizeof 来获取数组的大小,因为在这种情况下,数组的大小信息不会存储在指针中。
#include <stdio.h>
#include <stdlib.h>
void printSize(int *ptr, size_t size) {
printf("Dynamic array size: %zu\n", size);
}
int main() {
size_t n = 5;
int *arr = (int *)malloc(n * sizeof(int)); // 动态分配数组
if (arr == NULL) {
perror("Failed to allocate memory");
return 1;
}
printSize(arr, n); // 必须显式传递数组的大小
free(arr); // 释放动态分配的内存
return 0;
}
5、获取数组大小的使用示例
获取数组的大小常常会遇到一些问题,尤其是涉及到指针和数组传递时。获取静态数组、数组传递、动态数组、以及使用结构体传递数组大小的情况的使用示例。
#include <stdio.h>
#include <stdlib.h>
// 定义一个结构体用于保存数组和大小信息
typedef struct {
int *array;
size_t size;
} ArrayInfo;
// 打印数组信息的函数
void printArrayInfo(ArrayInfo arrInfo) {
printf("数组的元素数量: %zu\n", arrInfo.size);
for (size_t i = 0; i < arrInfo.size; ++i) {
printf("%d ", arrInfo.array[i]);
}
printf("\n");
}
// 示例:传递数组到函数并查看sizeof行为
void printArraySize(int arr[]) {
printf("在函数内部 sizeof(arr) = %zu (这是一个指针的大小)\n", sizeof(arr));
}
int main() {
// 1、静态数组
int staticArr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
size_t staticArrSize = sizeof(staticArr) / sizeof(staticArr[0]);
printf("在主函数中 sizeof(staticArr) = %zu\n", sizeof(staticArr));
printf("静态数组元素数量: %zu\n", staticArrSize);
// 调用函数传递数组
printArraySize(staticArr);
// 使用结构体传递静态数组信息
ArrayInfo staticArrInfo = {staticArr, staticArrSize};
printArrayInfo(staticArrInfo);
// 2、动态分配的数组
size_t dynamicArrSize = 5;
int *dynamicArr = malloc(dynamicArrSize * sizeof(int));
if (dynamicArr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 初始化动态数组
for (size_t i = 0; i < dynamicArrSize; ++i) {
dynamicArr[i] = (int)(i * 2);
}
// sizeof(dynamicArr) 只能返回指针的大小
printf("sizeof(dynamicArr) = %zu (这是一个指针的大小)\n", sizeof(dynamicArr));
// 使用结构体传递动态数组信息
ArrayInfo dynamicArrInfo = {dynamicArr, dynamicArrSize};
printArrayInfo(dynamicArrInfo);
// 释放动态分配的内存
free(dynamicArr);
return 0;
}