| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1069 人关注过本帖
标题:关于结构体转换的一点见解
只看楼主 加入收藏
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
结帖率:100%
收藏
 问题点数:0 回复次数:15 
关于结构体转换的一点见解
例如struct a
{
   char num1;
   char num2;
   char num3;
   char num4;
   int num5;
}
struct b
{
   int num6;
   char num7;
   char num8;
   char num9;
   char num0;
}
把a转换成b时,num1,2,3,4会合成一个int型的变量num6(假设int是四个字节的系统),在我的系统中num1对应num6的低字节,但是int型的num5不能将四个字节分配给num7,8,9,0,而是转换给了对应的第一个变量num7,例如num5=128,那么转换以后num7= -1,num8,9,0都是 0。
我只是最近开始研究这个,有经验的朋友请多多指导,
搜索更多相关主题的帖子: 结构体 朋友 
2011-02-16 18:41
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
没问题的,你理解有问题。
你定义的是signed char范围是-128 ~ 127。128自然存为-1。128只需要8bits空间,因此存在num7里。
想搞清楚的话你可以把char都定义为unsigned char,然后你就应该比较清楚了;或者,你可以让num5 = 一个大于255的数,然后看看结果。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-02-16 19:39
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:0 
路过,楼主可以再想想

免费赠送河蟹一只
2011-02-17 00:18
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:0 
回复 2楼 卧龙孔明
谢谢,非常感谢,
如果我把一个小的结构体( p1 )转换成一个大的结构体( p2 ),那么 p2是在p1的位置上扩大数据范围还是会从新开辟一个数据块,然后将p1的数据拷贝到这个新的数据块上呢?
2011-02-21 16:13
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
以下是引用韩明海在2011-2-21 16:13:18的发言:

谢谢,非常感谢,
如果我把一个小的结构体( p1 )转换成一个大的结构体( p2 ),那么 p2是在p1的位置上扩大数据范围还是会从新开辟一个数据块,然后将p1的数据拷贝到这个新的数据块上呢?
韩海明,你好。这个问题在以前我曾经回答过,但受到孔明先生的训斥。
请问,你怎么实现“把一个小的结构体( p1 )转换成一个大的结构体( p2 )”呢?如果用强制类型转换,那是行不通的,因为C不支持struct类型的类型转换。
因为如此,那么这个问题的讨论就没有意义了。
我想知道,在C语言中,具体怎么实现“把一个小的结构体( p1 )转换成一个大的结构体( p2 )”?

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-21 17:12
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
以下是引用犬虫门心在2011-2-21 17:12:37的发言:

韩海明,你好。这个问题在以前我曾经回答过,但受到孔明先生的训斥。
请问,你怎么实现“把一个小的结构体( p1 )转换成一个大的结构体( p2 )”呢?如果用强制类型转换,那是行不通的,因为C不支持struct类型的类型转换。
因为如此,那么这个问题的讨论就没有意义了。
我想知道,在C语言中,具体怎么实现“把一个小的结构体( p1 )转换成一个大的结构体( p2 )”?
程序代码:
#include<stdio.h>
struct A
{
    int x;
    char a,b,c,d;
}a;
struct B
{
    char i,j,k,l;
    int y;
}b;
int main(void)
{
    a = *(struct A*)(&b);
    return 0;
}

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-02-21 18:04
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
以下是引用韩明海在2011-2-21 16:13:18的发言:

谢谢,非常感谢,
如果我把一个小的结构体( p1 )转换成一个大的结构体( p2 ),那么 p2是在p1的位置上扩大数据范围还是会从新开辟一个数据块,然后将p1的数据拷贝到这个新的数据块上呢?
我不知道你是如何实现的这个转换。
这种转换我都是使用楼上帖的那种方式或者memcpy,如果是这样的话,那么应该是数据块的拷贝。

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2011-02-21 18:08
韩明海
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:253
专家分:749
注 册:2010-4-3
收藏
得分:0 
回复 7楼 卧龙孔明
好的,我的转换和你的代码基本一样的,谢谢
2011-02-21 19:34
丞相杀手
Rank: 6Rank: 6
等 级:侠之大者
帖 子:203
专家分:462
注 册:2011-1-11
收藏
得分:0 
做这样的转换,为什么不用共用体呢?

斗不过疯子,不参与争论。
2011-02-21 19:57
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
以下是引用韩明海在2011-2-21 16:13:18的发言:

谢谢,非常感谢,
如果我把一个小的结构体( p1 )转换成一个大的结构体( p2 ),那么 p2是在p1的位置上扩大数据范围还是会从新开辟一个数据块,然后将p1的数据拷贝到这个新的数据块上呢?


首先,你这个描述我第一反应是realloc函数.
其次,转换的意思是改变指针所指内存的大小及表示方式。如果你用一个小结构体p1转成大的p2,那么必然多出来的内存要么是没有预定的或者被其他的变量预定了。这样的结果就是非法访问或者破坏数据。
最后,如果考虑内存对齐的话,那么从这个意义上来说是可以实现你说的小结构到大结构的转换.例如:
__declspec(align(16))
struct p1{
int a;
char b1,b2,b3,b4;
}
struct p2{
int a;
char b1,b2,b3,b4;
int b,c;
}
由于p1是16字节对齐,所以会多出一些字节,可以对应到p2.

樱花大战,  有爱.
2011-02-21 21:21
快速回复:关于结构体转换的一点见解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.068691 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved