C语言中用sizeof计算函数传入的int数组长度结果错误如何解决?
问题根因分析
核心问题是C语言中数组作为函数参数传递时,会自动退化为指针,你在arraychecker函数中拿到的array本质是一个指向int类型的指针,不再是原始的数组类型。
你当前运行在64位系统环境下,指针的大小固定为8字节,int类型大小固定为4字节,因此sizeof(array)永远返回8,sizeof(array[0])永远返回4,计算得到的长度就固定为8/4=2,和你传入的原始数组长度完全无关。
你之前了解到的sizeof(array)/sizeof(array[0])计算方式,仅适用于数组定义所在的同一作用域:也就是在你代码的main函数里,直接对a、b做这个计算是可以得到正确长度的,一旦数组传递到其他函数,该计算方式就会失效。
可行解决方案
- 方案1:在数组定义的作用域提前计算长度,作为额外参数传入函数
#include<stdio.h> // 新增参数接收提前计算好的数组长度 void arraychecker(int array[], int length) { int arraylength = sizeof(array); int arraylength0 = sizeof(array[0]); printf("%d,%d,%d\n", length, arraylength, arraylength0); } int main() { int a[]= {2,1,3,4,9,33}; int b[]={2,55,3,2}; // 在main作用域计算长度后传入函数 arraychecker(a, sizeof(a)/sizeof(a[0])); arraychecker(b, sizeof(b)/sizeof(b[0])); return 0; }
- 方案2:使用宏定义封装长度计算逻辑(仅可在数组定义作用域使用)
// 定义通用数组长度计算宏 #define ARRAY_LENGTH(arr) (sizeof(arr)/sizeof(arr[0])) // 调用时直接传入宏计算结果即可 arraychecker(a, ARRAY_LENGTH(a));
- 方案3:自定义结构体封装数组和长度(适合需要高频传递数组的场景)
// 封装数组数据和长度为统一结构体 typedef struct { int *data; int length; } IntArray;
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

