900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > c语言强制转换为结构体 C语言结构体的强制类型转换

c语言强制转换为结构体 C语言结构体的强制类型转换

时间:2023-02-16 13:00:01

相关推荐

c语言强制转换为结构体 C语言结构体的强制类型转换

陈浩师兄03年的一篇博客《用C写有面向对象特色的程序》描述了用C语言来实现相似C++类继承的方法,这样方法的核心要点就是结构体的强制类型转换,让我来简单分析分析C语言中的结构体强制类型转换,仍是用陈浩师兄原博的结构体来举例吧。两个结构体以下:安全

/*双向链表 (相似于父类)*/typedefstructhLinks{struct hLinks *bwLink;struct hLinks *fwLink;

} hLinks;

/** 一个使用双向链表的结构

* (相似于子类)*/typedefstructhEnt{

hLinks links;inthData;char key[10];

} hEnt;

首先,咱们要搞清楚的一点是:C语言中的结构体并不能直接进行强制类型转换,只有结构体的指针能够进行强制类型转换。所以你能够在原博中看到在函数调用的时候有一些比较别扭的参数形式,咱们来看看。函数

/** 打印 (相似于子类重载父类的成员函数)*/PrintLink( hLinks*h )

{

hEnt*p ;for( p = ( hEnt* ) h->fwLink; /*

p= ( hEnt* )( (hLinks*)p )->fwLink )

{

printf("hData=[%d], key=[%s]/n", p->hData, p->key);

}

}

PrintLink函数的参数是一个hLinks类型的指针,所以在调用PrintLink时传入参数也应该是hLinks类型的指针,若是咱们定义的时候用下面这样的形式。spa

hLinks head;

那么在调用函数的时候就必须把它转换成hLinks指针,因而先取地址在强制类型转换。.net

PrintLink( (hLinks *) &head );

这样看起来确实是很别扭,若是咱们在声明结构体的时候这样作的话就能够避免这么难看的传递形式。指针

typedef hLinks *PtrhLinks;

话说回来,结构体指针的强制类型转换问题在这里面始终存在。PrintLink中就出现了这样的状况,那么在将hLinks指针转换为hEnt类型指针时有两个问题:code

结构体中的成员状况是怎么的?

结构体中的成员的值的状况是怎么样的?

首先,结构体是储存在一块连续内存中的,计算机只关心的是结构体的大小和操做方式,结构体大小是定义的时候决定的(要进行对齐),而结构体的操做确实和结构体中的成员类型有关的。指针表示的是内存地址,那么在强制类型转换以后,计算机便以转换后的结构体来看待这个地址内存中的内容。好比两个结构体的内存结构以下:对象

hLinks hEntblog

*bwLink

*bwLink

*fwLink

*fwLink

——(未定义)

hData

——(未定义)

key[10]

能够看出,在前两个内存单元中两个结构体存储的内容是相同的,固然无论相不相同计算机是无论的,当hLinks类型转换成hEnt类型时,计算机就将原结构体看作是hEnt类型的。转换后的hEnt类型结构体的前面两个内存单元的内容就是hLinks中的前两个单元内容,而hEnt的后两个内存单元中的内容取得是hLinks后的两个单元(这两个单元不是hLinks类型的成员,而是别的内容,全部若是转换后的hEnt要访问hData和key的话是不安全的!)。继承

总之一句话,在转换以后,计算机就按照转换后的结构体的组成结构来解释那么一段内存中存储的数据!!内存

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。