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

标签 c pointers

我对以下代码感到困惑,函数签名表明该函数返回一个空指针。然而实际返回的类型是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/

相关文章:

c - Rank 测试的空分布

c++ - 对指针列表进行排序

c - 双指针(struct tree_st **root)实际上是如何工作的?

c - 使用指针为 C 中的 3D 数组分配内存?

c - lcov : coverage of source for several executions

objective-c - 跳到字符串数组中的下一个非空白字符

c - 如何一次又一次地生成相同的信号(SIGALRM)?

c - BMI 计算器实验室找不到问题

剪断一根绳子?

c - 为以下代码分配了多少空间?