使用calloc分配18个BYTE元素数组时sizeof结果异常求助
为什么栈数组和calloc分配的数组用sizeof得到的结果不一样?
这问题我刚学C的时候也踩过一模一样的坑!本质是你混淆了数组类型和指针类型在sizeof运算符下的行为,咱们一步步说清楚:
核心原因
栈上声明的copyrow是数组变量,而calloc返回的copyrow是指针变量——这俩是完全不同的类型,sizeof对它们的计算逻辑天差地别。
1. 栈数组的情况
当你写:
int arrsize; BYTE copyrow[18]; arrsize = sizeof(copyrow);
这里的copyrow是一个长度为18的BYTE数组类型。sizeof会直接计算整个数组的总字节数:18 * sizeof(BYTE),而BYTE本身就是1字节,所以结果自然是18,符合你的预期。
2. 堆分配的情况
但当你用calloc分配时:
int arrsize; BYTE *copyrow; copyrow = calloc(18, sizeof(BYTE)); arrsize = sizeof(copyrow);
这里的copyrow是一个指针变量,它的作用是存储堆内存块的起始地址。在64位操作系统中,所有指针的大小都是8字节(32位系统是4字节),所以sizeof(copyrow)得到的是指针本身的大小,和它指向的内存块有多大完全没关系。你并没有只分配8个元素,calloc确实给你分配了18个BYTE的空间,只是你用错了方式去获取它的大小。
解决方案
C语言没有内置的方法能通过指针直接获取它指向的堆内存块大小,所以你需要手动记录分配的大小:
// 先把要分配的大小存在变量里 int arrsize = 18; BYTE *copyrow = calloc(arrsize, sizeof(BYTE)); // 之后需要用到这个大小时,直接用arrsize变量即可
这样不管后续怎么操作,你都能准确知道这块堆内存的元素数量啦。
内容的提问来源于stack exchange,提问作者ManKino
相关产品推荐
相关产品推荐

