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

C语言数组大小计算错误:输出为2而非预期的4

C语言数组传参后sizeof计算异常问题分析

你的代码

#include <stdio.h>

size_t arrSize(int a[])
{
    return sizeof(a)/sizeof(a[0]);
}

int main()
{
    int alfa[]={1, 2, 3, 4};
    size_t s= arrSize(alfa);
    printf("Array size: %zu", s);

    return 0;
}

问题原因

核心问题是C语言中数组作为函数参数时会自动退化为指向首元素的指针。函数定义里的int a[]语法本质上等价于int *a,所以在arrSize函数中:

  • sizeof(a)计算的是指针的字节大小(64位系统通常为8字节,32位系统为4字节)
  • sizeof(a[0])计算的是int类型的字节大小(通常为4字节)

如果是64位系统,8/4=2,这就是你得到输出2的原因。而在main函数中直接计算时,alfa是完整的数组类型,sizeof(alfa)会返回整个数组的总字节数(4个int共16字节),除以单个int的大小就得到正确的元素个数4。

解决方法

  • 直接在数组作用域内计算长度:就像你在main里直接写size_t s=sizeof(alfa)/sizeof(alfa[0])的方式,这是最简单直接的做法。
  • 将数组长度作为参数传递:修改函数定义,额外接收数组长度参数:
    size_t arrSize(int a[], size_t len)
    {
        return len;
    }
    // 调用时
    size_t s = arrSize(alfa, sizeof(alfa)/sizeof(alfa[0]));
    
  • 使用宏计算数组长度:定义一个宏来在数组作用域内计算长度,避免传参退化的问题:
    #define ARR_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
    // 在main中使用
    size_t s = ARR_SIZE(alfa);
    

内容的提问来源于stack exchange,提问作者quadron21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:16:26