如何检查C中的指针是否属于某种类型?

Cra*_*enz 13 c gcc

如何检查指针是否属于某种类型?

使用sizeof还不够.

我试图避免将id-numbers放入我的结构中来识别它们的类型.假设可能是gcc在进程中的某处放置了一个struct定义,并将定义映射到指针的已分配内存.如果这是真的,我认为会有一些检查指针类型.

Meh*_*ari 39

你不能.

指针仅存储地址,并且不存在与该地址的内容相关的任何内容.


Nos*_*dna 14

"我试图避免将笨蛋放入我的结构中来识别它们的类型." 不要避免这种情况.如果您确实希望能够检查类型,请将typeID作为每个结构的第一个元素.你的冲动并不坏.


and*_*vin 9

Gcc不会将结构定义放在运行时的任何位置.这意味着你不能作为标准.

它取决于您使用的类型信息.两个主要应用可能是:

  1. 调试或类似的运行时检查
  2. 数据结构的序列化和反序列化

在第一种情况下,信息通常可以存储在编译器输出的符号中并附加到可执行文件(在许多环境中).

实现是特定于平台的,通常意味着需要指示编译器输出此信息.执行此操作的程序的一个示例是gdb.仍然必须正确键入指针才能使其有用.

对于序列化类型,通常使用您建议的值标记.但这些标签不必与内存数据一起存储.它们可以通过输出例程添加.


Mic*_*man 7

指针类型.更一般地说,C不提供内省的能力.没有编程方法来确定变量的类型.


SPW*_*ley 6

这里发布的所有答案都说"你做不到." 他们是对的.你不能.

但是,我毫不犹豫地甚至提到它,也可以玩游戏.这些游戏是一个坏主意.在任何情况下我都不推荐它们.

比赛是什么?将牛排额外数据位填充到地址的未使用部分,并在使用地址的任何地方将其剥离.

因此,假设您有一个指向32字节大小的结构或类的指针.如果你确保你的内存分配与32字节地址对齐(这对于动态分配很容易,但对于堆栈的内容来说更难以保证),地址的低位将全部为0.这意味着有5个空闲位在地址的底部,足以让您放置标志,ID号,状态值等.存储空间是免费的!即使你有一个奇怪的结构大小,几乎任何C或C++编译器和操作系统将始终将每个地址对齐到4个字节.

在64位中,通常可以在地址的高端找到大量的空闲位...很可能是16个空闲的未使用位,等待着你.这当然取决于操作系统.还有一个坏主意要考虑.你喜欢危险,不是吗?

两个缺点是:

  1. 您必须确保在尝试取消引用指针之前屏蔽这些值,或将其传递给可能尝试的任何内容.这使得丑陋的代码.
  2. 你正在超越愚蠢危险的不可移植悬崖的边缘跳舞.这就像喝了一瓶龙舌兰酒,在饥饿的老虎身上走过一条磨损的钢丝绳.裸体.

如果你遵循我的建议你的命运http://ecoworldly.com/files/2008/11/siberian-tiger-amur-tiger-korean-tiger.jpg

有很多方法会导致漏洞,崩溃和痛苦.还记得我怎么说编译器将内存对齐至少4个字节?嗯,那是真的.直到找到没有的新操作系统.你是虎食.

所以不要这样做.

但是,这就是说,这确实是一种在每个地址中添加类型号等额外信息的方法.您可以在每个字节数的代码Obfusicated C中看到此技术.

PS:真的,我的意思是,不要这样做.即使你喜欢老虎.