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

cpu6660
  • 157

void show(void *d) {

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

}

回复
阅读 7.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语言里面没有类型,只有你认为它是什么类型。明白了吧。

其实并没有这种机制.

宣传栏