c void * 作为参数后,如何在函数中判断传入的参数的具体类型

void show(void *d) {

// 在这里,如何获取传入的d的具体类型,然后对不同的类型做处理

}

阅读 11.4k
5 个回答

最直接的答案:不能。C语言没有运行时类型机制更没有反射机制,所以仅靠语言本身机制不可能知道void *原来是什么类型。
但是有变通的办法,你自己定义一些数据结构,数据结构的第一个字段都是一个int整数,表明当前结构是什么类型。你准备数据时设置上这个字段。然后把void 强制转换为int,取出那个标志,再根据需要把void *进一步转换为结构的指针。

一定要用C吗,用C++的话使用模板或者重载就很轻松了,c的话尝试使用强制类型转换后判断一下是否合法吧。

void show(void *d) {
  if (sizeof(MyStruct) == sizeof((void *) d)) {
    // d 是 MyStruct 指针
  }
}

当然大小都一样的话,就不好判断了

C语言是弱类型语言。所有也就不存在判断类型的说法。

//这样的指针就是代表一个内存地址,没有类型信息。
//连边界都不包含
void *p
#include <stdio.h>

struct my_struct {
    int a;
    int b;
};

int main () {
struct my_struct *p = malloc(sizeof(struct my_struct));
p->a = 1;
p->b = 2;

int c = *((int *)p);  //c === 1
int d = *((int *)p+1); //d ===2

printf("%d %d",c,d); //output: 1,2

}

ps:

c语言里面没有类型,只有你认为它是什么类型。明白了吧。

其实并没有这种机制.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进