C 指针算术异常行为

C Pointer Arithmetic Strange Behavior

我有下面这一段看似简单的代码:

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 调用的输出不匹配。但是通过简单的算术,'actual' 应该匹配 'pBinHeader'。我错过了什么?

您正在使用两种不同的指针运算方法。

freeAddr 加 1(类型 void* )时,指针递增 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);