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

C语言数组在不同上下文的大小计算差异问题求助

为什么数组传入函数后用sizeof计算的长度和声明时不一样?

核心原因:数组传参时会退化为指针

C语言规定,数组作为函数参数传递时,会自动转换为指向数组首元素的指针——函数无法直接接收整个数组作为参数,只能接收指针类型。

两种场景的差异解析

  1. main函数中的计算
    在main里,a是明确的数组类型(int[12]),sizeof(a)计算的是整个数组占用的字节数(12个int,若每个int占4字节则为48字节)。除以sizeof(int)(4字节),自然得到元素个数12。

  2. createLL函数中的计算
    函数参数int* arr本质是一个指针变量,sizeof(arr)得到的是当前系统下指针类型的字节数:

    • 64位系统中指针占8字节,8 / 4 = 2,这就是你看到输出2的原因;
    • 若在32位系统中,指针占4字节,结果会是1。
      不管原数组实际长度多大,函数里的arr都是指针,所以这个计算结果只和系统位数有关,和数组本身无关。

解决办法

要在函数里正确获取数组长度,最稳妥的方式是额外传入数组长度参数:

修改后的代码示例:

LLNode* createLL(int* arr, int len)
{
    printf("%d ", len); // 直接使用传入的长度

    LLNode* head=(LLNode *)malloc(sizeof(LLNode));
    head->data = arr[0];
    head->next = NULL;
    int i=0;
    for(i=1; i<len; i++)
    {
        insertNode(head, arr[i]);
    }
    return head;
}

int main()
{
    int a[12] = {5,5,55,6,1,5,5,48,5,4,8};
    int arr_len = sizeof(a)/sizeof(int);
    printf("%d ", arr_len);
    LLNode* head = createLL(a, arr_len);
    // insertNode(head, 87);
    // printLL(head);
    return 0;
}

你也可以使用C99支持的变长数组(VLA),把函数参数写成LLNode* createLL(int len, int arr[len]),这样函数里sizeof(arr)能计算整个数组的字节数,但VLA有使用限制(比如不能用于静态变量初始化),所以多数场景下还是推荐传长度参数的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:30:39