共2条
1/1 1 跳转至页
问
最近一直被一个问题困扰
定义一个结构和一个缓冲区以及一个指针
typedef struct
{
uint8 a1;
uint16 a2;
}TEST;
uint8 buf[10]={0x01,0x02,0x03,0x04};
TEST * temp;
后
uint8 b1;
uint16 b2;
temp = (TEST *) buf;
b1 = temp->a1;
b2 = temp->a2;
结果应该是 b1 = 0x01;b2 = 0x0203
可仿真的结果是 b1 = 0x01;b2 = 0x0003
我的0x02哪去了???请教怎么解决?谢谢诸位大侠
答 1: 也许跟CPU的类型有关你用的是什么CPU?编译器呢? 答 2: packed struct 答 3: 估计是uint8 buf[10]定义有问题,类型不匹配 答 4: 同意cwal20同意cwal20
估计是uint8 buf[10]定义有问题,类型不匹配 答 5: 是这样的cpu 就是LPC2210 编译器是ADS1.2
uint8 以被定义 #define unsigned char uint8 答 6: 字节对齐方式,ARM是32位的,我在移植TCP/IP时,就碰到IP Header和UDP Header存在类似的情况,示例如下
typedef __packed struct TIPHeader
{
// IP header
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver= 4 |IHL= 5 |Type of Service| Total Length = 21 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification = 111 |Flg=0| Fragment Offset = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time = 123 | Protocol = 1 | header checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| source address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| destination address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding | < optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data ..........
+-+-+-+-+-+-+-+-+
*/
u8 VerLen;
u8 TOS;
u16 TotalLength;
u16 ID;
u16 Fragment;
u8 TTL;
u8 Protocol;
u16 Checksum;
T_IP_Addr SourceIP;
T_IP_Addr DestIP;
} T_IP_Header; 答 7: 有什么好的解决方法没?主要是别丢数据.
我也是在写TCP/IP协议栈的时候遇到的问题.
比较烦 答 8: 我觉得ADS1.2的结构体分配内存有问题你可以想办法查看一下 sizeof(TEST)到底多大,估计不是3。
我在做文件系统的MBR结构时遇到过结构体不能正常分配的问题。
定义一个结构和一个缓冲区以及一个指针
typedef struct
{
uint8 a1;
uint16 a2;
}TEST;
uint8 buf[10]={0x01,0x02,0x03,0x04};
TEST * temp;
后
uint8 b1;
uint16 b2;
temp = (TEST *) buf;
b1 = temp->a1;
b2 = temp->a2;
结果应该是 b1 = 0x01;b2 = 0x0203
可仿真的结果是 b1 = 0x01;b2 = 0x0003
我的0x02哪去了???请教怎么解决?谢谢诸位大侠
答 1: 也许跟CPU的类型有关你用的是什么CPU?编译器呢? 答 2: packed struct 答 3: 估计是uint8 buf[10]定义有问题,类型不匹配 答 4: 同意cwal20同意cwal20
估计是uint8 buf[10]定义有问题,类型不匹配 答 5: 是这样的cpu 就是LPC2210 编译器是ADS1.2
uint8 以被定义 #define unsigned char uint8 答 6: 字节对齐方式,ARM是32位的,我在移植TCP/IP时,就碰到IP Header和UDP Header存在类似的情况,示例如下
typedef __packed struct TIPHeader
{
// IP header
/*
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Ver= 4 |IHL= 5 |Type of Service| Total Length = 21 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification = 111 |Flg=0| Fragment Offset = 0 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time = 123 | Protocol = 1 | header checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| source address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| destination address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding | < optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data ..........
+-+-+-+-+-+-+-+-+
*/
u8 VerLen;
u8 TOS;
u16 TotalLength;
u16 ID;
u16 Fragment;
u8 TTL;
u8 Protocol;
u16 Checksum;
T_IP_Addr SourceIP;
T_IP_Addr DestIP;
} T_IP_Header; 答 7: 有什么好的解决方法没?主要是别丢数据.
我也是在写TCP/IP协议栈的时候遇到的问题.
比较烦 答 8: 我觉得ADS1.2的结构体分配内存有问题你可以想办法查看一下 sizeof(TEST)到底多大,估计不是3。
我在做文件系统的MBR结构时遇到过结构体不能正常分配的问题。
共2条
1/1 1 跳转至页
回复
| 有奖活动 | |
|---|---|
| 这个春节你犒赏自己什么了?分享你的故事,有奖征集 | |
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
我要赚赏金打赏帖 |
|
|---|---|
| 【S32K3XX】SWT 模块使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】32位linux内核内存映射896的理解被打赏¥14元 | |
| AG32VH407开发板例程体系的构成与使用方法被打赏¥20元 | |
| 【S32K3XX】SEMA42 模块使用被打赏¥26元 | |
| 【S32K3XX】XRDC 功能使用被打赏¥22元 | |
| 【分享开发笔记,赚取280元手持便携数字示波器】8051使用keil编译的程序移动心得被打赏¥21元 | |
| 【S32K3XX】HSE 密钥管理被打赏¥17元 | |
| 【S32K3XX】Standby RAM的初始化流程被打赏¥18元 | |
| Gravity:中英文语音合成模块V2.0及其串口控制被打赏¥24元 | |
| 全彩色度变化图的绘制被打赏¥27元 | |
我要赚赏金
