You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:06