热转印www.yxheatpress.com

公司网站模板http://qiyemoban.software8.co/

常用链接

统计

友情链接

最新评论

C编程小技巧——结构体强制类型转换

问题

前些天看一款数据库语法解析器的代码,其中的词法分析语法解析阶段,利用一个结构体存储所解析的SQL语句的类型,然后根据这个类型将改结构体强制转换为对应的另一结构体并赋值给他,以便做进一步的执行工作。
举个简单的例子:
存储语法解析后数据的结构体(注意,其只有一个元素)为:
struct analyse
{
int type;
};
我们约定的不同的type代表不同的SQL操作,假如type=1时表示alter table操作,type=2时表示select操作,type等于3时表示create table操作等等。那么我们对不同的操作有不同的结构体来存储信息,例如:
struct alter
{
int type;
int number;
char subtype;
......
......
};
struct select
{
int type;
char relnum;
long tablenum;
......
......
};
注意到,结构体analyse,alter与select中第一个元素的类型都是一样的,表示的意思也相同,都是代表不同的操作号。现在若判断analyse中的type为1时,就将其强制转换为struct alter并赋值给struct alter类型的变量;若判断analyse中的type为2时,就将其强制转换为struct select并赋值给struct select类型的变量。
可能有人会问了,为什么程序里要对类型不同的结构体之间强制转换并赋值呢?

问题解析

问题的关键在于,结构体struct analyse中的type存储不同的值时,在紧挨着结构体的内存中按照要强制转换的结构体的元素类型存储了相对应的数据。

例如,当结构体struct analyse中的type为1时,需要在紧挨着结构体struct analyse的高地址区域按照结构体struct alter的数据类型存储对应的数据,包括int,char等等。当结构体struct analyse中的type为2时,需要在紧挨着结构体struct analyse的高地址区域按照结构体struct select的数据类型存储对应的数据,包括char,long等。

这样,在进行强制转换时,结构体struct analyse与结构体struct analyse中除了int type以外的那些元素就可以得到相对应的值了。


简单的小例子

下面是一个简单的小例子,说明了该强制转换的问题:

  1. struct A{  
  2.     int num;  
  3. };  
  4.   
  5. struct B{  
  6.     int num;  
  7.     char type;  
  8.     int age;  
  9. };  
  10.   
  11. int main()  
  12. {  
  13.     struct A a;  
  14.     a.num=1;  
  15.   
  16.     char* tmp1=(char *)(&(a.num));  
  17.     tmp1=tmp1+4;  
  18.     *tmp1='a';  
  19.     int *tmp2=(int *)(&(a.num));  
  20.     tmp2=tmp2+2;  
  21.     *tmp2=100;  
  22.   
  23.     struct B *b=(struct B *)(&a);  
  24.   
  25.     printf(" b->num=%d  b->type=%c  b->age=%d \n",b->num,b->type,b->age);  
  26. }  

posted on 2012-11-06 10:52 不听话的 阅读(1296) 评论(1)  编辑 收藏 引用

评论

# re: C编程小技巧——结构体强制类型转换 2012-11-06 17:21 Jason Huang

您好,

我是猎头顾问Jason,现在给一家创业型美企(中美都有研发中心,全球<100人,业务是PC/MAC/iOS/Android/WP上的视频电话,海淀苏州街,清华北大班底)招聘C++高级开发工程师。

开发要求1、精通Linux or Windows底层知识;2、精通C++;3、精通数据结构和算法。

无论您现在做的什么方面的开发,只要您对mobile客户端产品的开发感兴趣并满足职位要求的3个条件,都可以应聘。

开发基本工资30-40万+奖金+高额期权。

不知道您或者您身边有人考虑此职位么?

BR,
Jason
010-5283 7763
jason@isofttalent.com  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理