gpt4 book ai didi

C 指针算术异常行为

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:37 25 4
gpt4 key购买 nike

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

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(类型 void* )加 1 时,指针递增 1。
(这是一个扩展。在 C 中,void* 指针不能用于指针运算)

将 1 加到 pBinHeader(类型 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);

关于C 指针算术异常行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35972937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com