结构和数组的转换问题

Alexeyomux 2002-09-04 07:46:33
定义结构
struct
{
char a;
short b;
int c;
char d;
}abc;
struct abc* p;
char buf[100];
p = buf;
赋值后输出buf(16进制)
其中要改变编译对齐参数

请问输出buf(16进制)和改变编译对齐参数是什么意思?此题作何解?



...全文
21 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxjddd 2002-09-04
  • 打赏
  • 举报
回复
可以优化一下啊:
struct abc
{
char a;
char d;
short b;
int c;
};
ustcxumq 2002-09-04
  • 打赏
  • 举报
回复
多谢楼上的,也让我更深的理解了位和存储
Alexeyomux 2002-09-04
  • 打赏
  • 举报
回复
感谢各位指点!
joke100 2002-09-04
  • 打赏
  • 举报
回复

#pragma pack(1) // 单字节对齐
struct abc
{
char a;
short b;
int c;
char d;
};
#pragma pack() // 恢复对齐的默认设置

一般默认是四字节对齐,如果不改为单字节对齐的话,那么a与b之间将插入3个字节,b与c之间插入2字节....

abc HAHA;
sizeof(HAHA);
所以,不单字节对齐,sizeof(HAHA) > (sizeof(HAHA.a) + sizeof(HAHA.b) + sizeof(HAHA.c) + sizeof(HAHA.d))
明白原因了吧???

答案,四字节对齐sizeof(HAHA)等于16
单字节对齐sizeof(HAHA)等于8



mzz_810 2002-09-04
  • 打赏
  • 举报
回复
题目要求是对p的每个成员赋值,然后打印出buf,看看p的成员是如何在内存中存放的。在不同的对齐参数下,存放位置是不同的。
这个题目目的是让你了解变量在内存中的存放方式!
mzz_810 2002-09-04
  • 打赏
  • 举报
回复
编译对齐参数指的是变量在内存中的对齐方式,对于32位CPU来说,一般缺省认为是按4字节对齐,因此结构abc的成员b是从偏移4字节处开始存放的,成员a后面3个字节是空着的。
但是,通过改变编译对齐参数,可以改变内存中的对齐方式,如指定:
#pragma align 1
则之后的代码是按字节对齐的,即成员a、b、c、d是连续存放的。
#pragma align 0 表示按缺省对齐方式
jerry921 2002-09-04
  • 打赏
  • 举报
回复
应该为:
typedef struct
{
char a;
short b;
int c;
char d;
}abc;

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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