C指针算术奇怪行为

时间:2016-03-13 16:50:12

标签: c pointers pointer-arithmetic

我有以下看似简单的代码:

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'。我错过了什么?

1 个答案:

答案 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);