我对以下代码感到困惑,函数签名表明函数返回一个void指针。实际返回的类型是BlockInfo *。该函数在列表中搜索大小为reqSize的第一个空闲内存块。整个程序编译并正确运行。
static void * searchFreeList(size_t reqSize) {
BlockInfo* freeBlock;
freeBlock = FREE_LIST_HEAD;
while (freeBlock != NULL){
if (SIZE(freeBlock->sizeAndTags) >= reqSize) {
return freeBlock;
} else {
freeBlock = freeBlock->next;
}
}
return NULL;
}
我的问题是:
(1)为什么return freeBlock
返回类型BlockInfo *的有效语句。
(2)对于返回void指针的函数,当它的返回值被赋值给另一个指针变量时,例如:
int * ptr; // Or double* ptr, etc.
ptr = searchFreeList(someSize);
这些有效的作业吗?
非常感谢!
答案 0 :(得分:4)
为什么返回freeBlock,它返回类型BlockInfo *一个有效的语句。
void *
是一种通用指针类型,保证保存任何对象指针类型。在void *
的所有对象指针类型之间存在隐式转换,因此在return语句中甚至不需要强制转换。
int * ptr; //或者双倍* ptr等 ptr = searchFreeList(someSize); 这些有效的作业是什么?
是的,它们是有效的赋值,但如果底层类型是不同的类型,则取消引用指针可能是未定义的行为。
例如:
char a = 42;
void *p = &a;
int *q = p;
*q; // undefined behavior
答案 1 :(得分:1)
在C中,void *
是通用指针类型。它可以指向任何指针类型。所以,
ptr = searchFreeList(someSize);
是有效的作业。
答案 2 :(得分:0)
void
指针可以存储任何类型的地址,在这种情况下,它存储类型BlockInfo
的地址。因此,当函数返回类型BlockInfo
的指针时,它完全没问题,因为原型在这种情况下并不关心类型。
问题的第二部分,您询问是否
int *ptr = searchFreeList(someSize);
有效。是的
int *p = malloc(sizeof(int) *2);
有效,此处malloc()
返回void *
结果将是指向某个结构并且取消引用它的int类型的指针将是UB