字符数组强制转化为结构体

markman101 2010-02-01 10:18:25

数据类型:
struct TalkFrame
{
char cFlag[16];
unsigned __int32 iCom;
unsigned __int32 iLen;
};


char buffer[32];
memset(buffer,0,32);
struct TalkFrame *frame;
frame = (struct TalkFrame *)buffer;
sprintf(frame->cFlag,"TalkFrame");

frame->iLen = 0;
frame->iCom = TC_NORMAL_TALK;
考虑字节对齐后 TalkFrame 的大小是 32*3=96
char buffer[32];的大小是32
那么frame = (struct TalkFrame *)buffer;

frame指向的是的内存空间是32位的
(buffer的内存空间小于 frame 需要的内存空间 )
如果指向
frame->iLen = 0;
frame->iCom = TC_NORMAL_TALK;
这样不就越界了(超出buffer指向的内存空间)吗?

...全文
967 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
eyodo8 2010-02-01
  • 打赏
  • 举报
回复
字节对齐仅仅是指结构体占用的内存空间,跟你结构体里面的字段没有关系,int占4个字节,不论你使用单字节对齐,双字节对齐,4字节对齐,都不会变的。所以你考虑的问题是不存在的。
jx1j1x 2010-02-01
  • 打赏
  • 举报
回复
楼主应该是学习派的吧,理论性很强,知道有字节对齐。结贴率这么低。我是来赚分的。
jx1j1x 2010-02-01
  • 打赏
  • 举报
回复
一般我习惯于#pram pack(1)单字节对齐
这样省的考虑字节对齐的烦恼,速度应该没多大影响的。
否则有时候字节对齐暴露出来的问题很郁闷的。
jx1j1x 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vercitti 的回复:]
强转的时候和字节对齐有什么关系?


[/Quote]
有一定的关系。字节对齐在强制转换,初始化,作为网络传输协议的时候特别要注意啊。

不过楼主对字节对齐的原理可能不理解。
struct TalkFrame
{
char cFlag[16];
unsigned __int32 iCom;
unsigned __int32 iLen;
};
这个结构体应该是4字节对齐的。
所以这个结构的大小就是16+4+4=24,而不是楼主说的考虑字节对齐后 TalkFrame 的大小是 32*3=96

vercitti 2010-02-01
  • 打赏
  • 举报
回复
强转的时候和字节对齐有什么关系?

havedown 2010-02-01
  • 打赏
  • 举报
回复
buffer的内存空间小于 frame 需要的内存空间

frame->iLen = 0;


那肯定不行啦。
c_s0001 2010-02-01
  • 打赏
  • 举报
回复
buffer不足,只导致结构体的部分数据没有被赋值,没有越界的概念
zjutyww 2010-02-01
  • 打赏
  • 举报
回复
我也很好奇啊,楼主 上面实际的buffer 空间 比 frame 空间大(24),是没问题的,输出 是 0;

但是 当 buffer 空间 比frame 小的时候 ,也没有报错,输出只是乱码而已,

刚开始想法 跟 二楼一样,但是细想 “按结构体的部分数据 没赋值”这个想法不对,因为结构体数据的内存空间还没对应呢,

我觉得 其性质 跟数组 越界一个样,只不过 VC对此 没有检查而已.
vercitti 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jx1j1x 的回复:]
引用 3 楼 vercitti 的回复:
强转的时候和字节对齐有什么关系?



有一定的关系。字节对齐在强制转换,初始化,作为网络传输协议的时候特别要注意啊。

不过楼主对字节对齐的原理可能不理解。
struct TalkFrame
        {
    char cFlag[16];
    unsigned __int32 iCom;
    unsigned __int32 iLen;
        };
这个结构体应该是4字节对齐的。
所以这个结构的大小就是16+4+4=24,而不是楼主说的考虑字节对齐后 TalkFrame 的大小是 32*3=96


[/Quote]

哪里看出上面的代码是在网络传输的时候用的?
memcpy不行么为啥要强转

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧