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
相关产品推荐
相关产品推荐

