我对以下代码感到困惑,函数签名表明该函数返回一个空指针。然而实际返回的类型是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);
这些作业有效吗?
非常感谢!
最佳答案
Why is return freeBlock,which returns type BlockInfo* a valid statement.
void *
是通用指针类型,并保证保存任何对象指针类型。所有对象指针类型之间都存在到 void *
的隐式转换,因此 return 语句中甚至不需要强制转换。
int * ptr; // Or double* ptr, etc. ptr = searchFreeList(someSize); Are these valid assignments?
是的,它们是有效的赋值,但如果基础类型是不同的类型,则取消引用指针可能是未定义的行为。
例如:
char a = 42;
void *p = &a;
int *q = p;
*q; // undefined behavior
关于c - 函数签名指示返回类型 void*,但返回不同类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27719252/