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

时间:2014-12-31 09:48:29

标签: c pointers

我对以下代码感到困惑,函数签名表明函数返回一个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);

这些有效的作业吗?

非常感谢!

3 个答案:

答案 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