查看: 3490|回复: 8

[其他] 从来没见过的指针和结构体的用法,高手来看看行不行

[复制链接]

该用户从未签到

4

主题

37

帖子

0

注册会员

Rank: 2

积分
171
最后登录
2020-12-29
发表于 2012-4-3 11:34:44 | 显示全部楼层 |阅读模式
编程的过程中为了方便会使用很多结构体,然而使用串口通信时却要按字节发送。我想定义一个char型指针,将结构体的地址给他,然后在利用char型指针将数据发送出去,但是结构体的内存分配和对齐又好像会产生额外的空内存
unsigned char *p;
struct exp
{
   unsigned long  long_data;
    unsigned char char_data;
    unsigned int    int_data;
}example;
p = & example;
putchar( sizeof(example) , p );
在实际上sizeof(exp)=8并不是4+1+2=7!这时候该怎么办呢,因为不同的处理器(如上位机和下位机通信),和不同的编译环境(内存对齐的方式也是不一样的),发送上去的数据顺序也会不一样,所以我感觉这样的通信几乎是不可能会实现了,到底该怎样才能把结构体拆开按字节发送上去呢,跪求高手指点迷津!
我知道答案 目前已有7人回答
回复

使用道具 举报

该用户从未签到

8

主题

46

帖子

0

新手上路

Rank: 1

积分
89
最后登录
1970-1-1
发表于 2012-4-3 11:59:11 | 显示全部楼层

RE:从来没见过的指针和结构体的用法,高手来看看行不行

按字节对齐,应该行。p = & exp;这个好像有问题,结构体只是一个数据类型,取他的地址好像没什么意义,取地址也是取结构体变量的地址。我也是菜鸟,个人理解。
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

37

帖子

0

注册会员

Rank: 2

积分
171
最后登录
2020-12-29
 楼主| 发表于 2012-4-3 12:20:44 | 显示全部楼层

回复:从来没见过的指针和结构体的用法,高手来看看行不行

回复第 2 楼 于2012-04-03 03:59:11发表:
按字节对齐,应该行。p = & exp;这个好像有问题,结构体只是一个数据类型,取他的地址好像没什么意义,取地址也是取结构体变量的地址。我也是菜鸟,个人理解。
去到他的首地址,就不用做任何处理就可以得到单字节的数据了,但是根据结构体的对齐方式来看好像是有点问题,上面我写错了一个地方,更正了
 
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

10

帖子

0

新手上路

Rank: 1

积分
12
最后登录
1970-1-1
发表于 2012-4-3 19:28:27 | 显示全部楼层

RE:从来没见过的指针和结构体的用法,高手来看看行不行

#pragma pack (push ,1)                   //修正字节对齐
/*你的结构体*/
#pragma pack (pop)
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

46

帖子

0

新手上路

Rank: 1

积分
89
最后登录
1970-1-1
发表于 2012-4-3 23:48:35 | 显示全部楼层

RE:从来没见过的指针和结构体的用法,高手来看看行不行

楼上正解!!!!
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

37

帖子

0

注册会员

Rank: 2

积分
171
最后登录
2020-12-29
 楼主| 发表于 2012-4-4 11:06:41 | 显示全部楼层

回复:从来没见过的指针和结构体的用法,高手来看看行不行

回复第 4 楼 于2012-04-03 11:28:27发表:
#pragma pack (push ,1)                   //修正字节对齐
/*你的结构体*/
#pragma pack (pop)
 
 
再问一下
#pragma pack (push ,1) //修正字节对齐
typedef struct exp
{
 unsigned long  long_data;
    unsigned char char_data;
    unsigned int    int_data;
}expdef;
#pragma pack (pop)
 
这样可以用吗
如果继续声明结构体
expdef example;
这样example还是按照上面的对其方式吗? 谢谢!
 
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

46

帖子

0

新手上路

Rank: 1

积分
89
最后登录
1970-1-1
发表于 2012-4-4 16:07:35 | 显示全部楼层

回复:从来没见过的指针和结构体的用法,高手来看看行不行

回复第 6 楼 于2012-04-04 03:06:41发表:
回复第 4 楼 于2012-04-03 11:28:27发表:
#pragma pack (push ,1) //修正字节对齐
/*你的结构体*/
#pragma pack (pop)
 
 
再问一下
#pragma pack (push ,1) //修正字节对齐
typedef struct exp
{
 unsigned long  long_data;
    unsigned char char_data;
    unsigned int    int_data;
}expdef;
#pragma pack (pop)
 
这样可以用吗
如果继续声明结构体
expdef example;
这样example还是按照上面的对其方式吗? 谢谢!
 
应该还是按照上面的对齐方式的,楼主不妨在vc中试一下,用sizeof去一下大小,打印出来,验证一下自己的想法。
 
 

 
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

37

帖子

0

注册会员

Rank: 2

积分
171
最后登录
2020-12-29
 楼主| 发表于 2012-4-4 17:06:57 | 显示全部楼层

回复:从来没见过的指针和结构体的用法,高手来看看行不行

 
 明天回去试试   C语言博大精深啊  越学越觉着自己不会

 

 
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

45

帖子

0

注册会员

Rank: 2

积分
154
最后登录
2021-12-2
发表于 2012-4-24 15:06:33 | 显示全部楼层

RE:从来没见过的指针和结构体的用法,高手来看看行不行

一个新的知识点,我得翻书在调试看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-13 00:44 , Processed in 0.103625 second(s), 29 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表