我有以下看似简单的代码:
void freeBin(MallocHeader * pBinHeader){
while(pBinHeader){
MallocHeader * pNext = pBinHeader->pNext;
pBinHeader->magic = K_MAGIC_NUM;
printf("Orig magic and size = %i %lu\n", pBinHeader->magic, pBinHeader->size);
void * freeAddr = pBinHeader + sizeof(MallocHeader);
MallocHeader * actual = freeAddr - sizeof(MallocHeader);
printf("Pre free magic and size = %i %lu\n", actual->magic, actual->size);
free(freeAddr);
pBinHeader = pNext;
}
}
第一个printf调用的输出与第二个printf调用的输出不匹配。但通过简单的算术,实际的'应匹配' pBinHeader'。我错过了什么?
答案 0 :(得分:4)
您正在使用两种不同的指针算术方法。
当向freeAddr
(类型void *)添加1时,指针增加1.
(这是一个扩展。在C void *指针不能用于指针算术)
向pBinHeader
添加1(类型为MallocHeader *)时,指针增加sizeof(MallocHeader)
。
解决方案是使用正确的指针类型声明pBinHeader
:
MallocHeader* freeAddr = pBinHeader + sizeof(MallocHeader);
MallocHeader * actual = freeAddr - sizeof(MallocHeader);
或投下指针:
void * freeAddr = pBinHeader + sizeof(MallocHeader);
MallocHeader * actual = (MallocHeader*)freeAddr - sizeof(MallocHeader);