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

为什么C语言中使用sizeof()计算数组长度得到错误结果?

错误原因

你在insert函数中使用sizeof(array)/sizeof(array[0])计算数组长度得到错误结果,核心原因是 C语言中数组作为函数参数传递时会自动退化为指针:

  • 在main函数中,你定义的int array[5]是实打实的数组类型,此时sizeof(array)计算的是整个数组占用的总字节数,除以单个元素的字节数可以得到正确的元素个数5。
  • 当你把array传入insert函数时,形参int * array本质是一个指向数组首元素的指针,sizeof(array)计算的是指针本身占用的字节数,而不是整个数组的字节数。你得到结果为2,说明你当前编译环境下指针占4字节、int类型占2字节,4/2=2,所以得到错误的计算结果。

另外你的代码还有两处额外问题:

  • exit是系统函数,必须加括号传参,正确写法是exit(EXIT_FAILURE);
  • 你当前定义的array长度只有5,且已经存满了5个元素,直接插入会触发数组越界访问,如果需要支持插入功能,定义数组时要预留足够的空余容量。
修复方案

你已经把数组当前已存储的元素个数number_of_elements作为参数传入了insert函数,只需要在传参时额外传入数组的总容量即可,不需要在函数内计算数组长度。

修正后的完整代码
#include <stdio.h>
#include <stdlib.h>

// 新增参数array_capacity表示数组的总容量
void insert(int * array,int number_of_elements,int array_capacity,int index,int value)
{
    int i;
    // 直接用传入的总容量判断是否可插入
    if(number_of_elements >= array_capacity)
    {
        printf("Insertion failed");
        exit(EXIT_FAILURE);
    }
    else
    {
        for(i=number_of_elements;i>index;i--)
        {
           array[i]=array[i-1];
        }
        array[index]=value;
    }
}

int main()
{
    // 数组定义为10个长度,预留插入空间,总容量为10
    int array[10],i,number_of_elements=5,value=-9,index=3;

    for(i=0;i<=number_of_elements-1;i++)
    {
        scanf("%d",&array[i]);
    }
    printf("\n");
    for(i=0;i<=number_of_elements-1;i++)
    {
        printf("%d\t",array[i]);
    }
    printf("\n");

    // 传入数组总容量10
    insert(array,number_of_elements,10,index,value);
    number_of_elements +=1;
    for(i=0;i<number_of_elements;i++)
    {
        printf("%d\t",array[i]);
    }
    printf("\n");
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:54:01