C语言 函数签名指示返回类型 void*,但返回不同类型的指针



我对以下代码感到困惑,函数签名指示函数返回一个 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)为什么返回类型BlockInfo*的return freeBlock是有效的语句。(2) 对于返回 void 指针的函数,当其返回值分配给另一个指针变量时,例如:

int * ptr;  // Or double* ptr, etc.
ptr = searchFreeList(someSize);

这些分配是否有效?

多谢!

为什么返回 freeBlock,它返回类型 BlockInfo* 一个有效的语句。

void * 是泛型指针类型,可以保证包含任何对象指针类型。所有对象指针类型之间都有一个隐式转换void *因此 return 语句中甚至不需要强制转换。

int * PTR; 或双*PTR等。 ptr = 搜索自由列表(someSize); 这些分配是否有效?

的,它们是有效的赋值,但如果基础类型是不同的类型,则取消引用指针可能是未定义的行为。

例如:

char a = 42;
void *p = &a;
int *q = p;
*q;  // undefined behavior

在 C 中,void * 是一种泛型指针类型。它可以指向任何指针类型。所以

ptr = searchFreeList(someSize);  

是有效的分配。

void指针可以存储任何类型的地址,在本例中,它存储的是 BlockInfo 类型的地址。因此,当函数返回类型为 BlockInfo 的指针时,它完全没问题,因为在这种情况下原型不关心类型。

问题的第二部分,你问是否

int *ptr = searchFreeList(someSize);

有效。是的

int *p = malloc(sizeof(int) *2);

有效,此处malloc()返回void *

结果将是指向某个结构并取消引用它的 int 类型的指针将是 UB

最新更新