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);
我有下面这一段看似简单的代码:
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);