发 帖  
原厂入驻New
[问答] 1个Uint16和1个Uint32总共占用3字,实际上sizeof返回值为4是为什么?
2020-6-1 13:14:59  128 编译器
分享
C2000芯片c编译器支持sizeof,这个函数返回的是目标类型所含Word数,1个Word等于2byte,一般C语言环境中sizeof返回的是byte数,现在的问题在于如果将Uint16和Uint32类型的数据定义在一起,组成一个结构体,用sizeof获取结构体的长度,在Uint16数据成员的个数为双数时用sizeof能够准确的获取结构体类型占用空间,如果Uint16成员为单数时,sizeof获取的结构体占用空间与预想的不同,比如1个Uint16和1个Uint32总共占用3字,而实际上sizeof返回值为4,这是怎么回事?应该如何处理?
0
2020-6-1 13:14:59   评论 分享淘帖
5 个讨论
C28x的能够处理和支持的最小数据单位是16bits也就是常说的1个word,或者2个bytes,所以对Uint16进行sizeof操作的结果是1,这个也是你前面描述正确的。
但是你的问题跟这个没有关系,而是内存对齐的问题。因为理论上的内存分配是从Uint16开始,然后是Uint32,对于只有两个变量的结构体,它们占用的空间是Uint16的变量占用一个地址,其后的那个地址是空闲不使用的,然后是再之后连续两个地址用于存放Uint32的变量,你可以尝试交换它们的位置对比看一下,也可以在编译器手册中(spru513, spru514)搜索alignment进行更多了解。
                                                                         If a post answers your question, please mark it with the "verify answer" button.
2020-6-1 13:31:22 评论

举报

szbliy 发表于 2020-6-1 13:31
C28x的能够处理和支持的最小数据单位是16bits也就是常说的1个word,或者2个bytes,所以对Uint16进行sizeof操作的结果是1,这个也是你前面描述正确的。
但是你的问题跟这个没有关系,而是内存对齐的问题。因为理论上的内存分配是从Uint16开始,然后是Uint32,对于只有两个变量的结构体,它们占用的空间是Uint16的变量占用一 ...

确实是地址对齐的问题,但是现在的问题是结构体的位置是不能改变的,如果用指针指向结构体的首地址,然后向外部系统发数据,由于地址对齐的问题将会多发一个字,而且这个字后面的内容将会偏移,用alignment可以临时将这一段设置为一个字宽吗
2020-6-1 13:39:20 评论

举报

不可以,这个是编译器已经决定的,不过建议你可以仅对结构体的Uint16进行sizeof操作,然后再对Uint32进行sizeof操作后求和。
                                                                         If a post answers your question, please mark it with the "verify answer" button.
2020-6-1 13:56:48 评论

举报

如果用16位指针遍历结构体,向外部总线输出数据,应该会在填充的位置产生一个不必要的数据,有什么办法可以解决这个问题
2020-6-1 14:10:33 评论

举报

liangxxxxx 发表于 2020-6-1 14:10
如果用16位指针遍历结构体,向外部总线输出数据,应该会在填充的位置产生一个不必要的数据,有什么办法可以解决这个问题

建议的做法是更改结构体的定义,如果实在不行,就必须通过软件判断,将该填充位的数据截取出来丢弃。
                                                                         If a post answers your question, please mark it with the "verify answer" button.
2020-6-1 14:16:43 评论

举报

只有小组成员才能发言,加入小组>>

1306个成员聚集在这个小组

加入小组

创建小组步骤

关闭

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

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