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

C语言中calloc创建的动态数组长度计算异常问题求助

动态分配数组用sizeof计算长度出错的原因

你遇到的问题核心是:arr是指针变量,不是真正的数组,所以sizeof(arr)获取的不是数组的总字节数,而是指针本身的大小。

在64位系统中,指针的大小通常是8字节,而int类型一般是4字节,所以8 / 4 = 2,这就是你得到结果2的原因。

为什么静态数组可以用sizeof计算长度?

如果是栈上定义的静态数组,比如int arr[5];,编译器在编译时就知道数组的长度,sizeof(arr)会返回整个数组的字节数(5*4=20字节),此时sizeof(arr)/sizeof(arr[0])就能正确算出元素个数5。

但你用calloc动态分配的内存是在堆上,arr只是一个指向堆内存起始地址的指针,编译器不知道它指向的内存块里有多少个元素,所以sizeof(arr)只能得到指针的大小(8字节),自然算不出正确的数组长度。

解决办法

  • 手动记录数组长度:定义一个变量保存分配的元素个数,比如:
    int len = 5;
    int *arr = calloc(len, sizeof(int));
    // 后续直接用len作为数组长度
    printf("%d", len);
    
  • 如果需要在多个函数中使用,可以把指针和长度封装成结构体,方便管理。

你的代码问题点

int *arr;
arr=(int*)calloc(5,sizeof(int));

arr[0]=1,arr[1]=2,arr[2]=3,arr[3]=4,arr[4]=5;
// 这里arr是指针,sizeof(arr)是指针大小,不是数组总字节数
printf("%ld",sizeof(arr)/sizeof(arr[0]));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:23:15