【发布时间】:2014-11-25 23:34:39
【问题描述】:
释放分配的内存时程序崩溃:“X 处的堆块在 Y 处修改,超过了请求的 21 大小”。
运行函数 getUstr,在 free(uStr) 上崩溃。 有人可以帮我找到我在哪里使用未分配的内存吗? 谢谢!
int HexToUChars(char* hexStr, unsigned char **str){
int i, n;
int strLen = strlen(hexStr)/2;
for (i = 0; i < (int)strLen; i++) {
sscanf_s(hexStr + 2 * i*sizeof(unsigned char), "%02X", *str+i*sizeof(unsigned char));
}
return 0;
}
int getUStr(){
char *hexStr = "E7CA7905DD060F0E437C885BF13DED9243B1D2BD94CB11223DA71360A8F7D2D4";
unsigned char *uStr;
size_t strLen = (size_t)strlen(hexStr) / 2;
uStr = calloc((strLen + 1), sizeof(unsigned char));
if (uStr != NULL){
HexToUChars(hexStr, &uStr);
free(uStr);//Error : Heap block at X modified at Y past requested size of 21
}
}
【问题讨论】:
-
uStr 已经是一个指针,函数 HexToUChars() 并没有改变那个地址,所以将 uStr 的地址传递给的唯一结果是代码中的复杂性。
-
原来内存是在HexToUChars函数中分配的,所以我把它作为指针传入。