看了“内存对齐”,自己的一些小问题。

1cs1ak1 2003-07-19 12:14:00
typedef struct
{
int a;
char b[5];

char c[8];
}node;

void main()
{


// node *p = (node *)malloc(sizeof(node));
node *p = NULL;
printf("%d", sizeof(*p));

}
VC默认是8byte对齐吧
那我就理解node在内存里这样。
typedef struct
{
int a;
char pad1[4]; //填充
char b[5];
char pad2[3]; //

char c[8];
}node;

那就为24个byte,为什么sizeof(node)为20啊(和4byte对齐一样了)

node *p = NULL;
p指向一个空地址,那为什么sizeof(*p)还有值啊。

问题很菜,希望大家不要笑。


...全文
85 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckacka 2003-07-22
  • 打赏
  • 举报
回复
呵呵,今天才看到

http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&inlang=zh-CN&threadm=c638aac5.0307090816.11bd9536%40posting.google.com&rnum=2&prev=/groups%3Fq%3Dlayout/%2Balignment%26hl%3Dzh-CN%26lr%3D%26ie%3DUTF-8%26inlang%3Dzh-CN%26selm%3Dc638aac5.0307090816.11bd9536%2540posting.google.com%26rnum%3D2
1cs1ak1 2003-07-21
  • 打赏
  • 举报
回复



今天才来看到,小帽啊,怎么找啊。
说实话我还是有点糊涂。




cloudtarget 2003-07-21
  • 打赏
  • 举报
回复
4对齐吧
whydoyoucare 2003-07-20
  • 打赏
  • 举报
回复
小红帽,你说的东西怎么找啊?
ckacka 2003-07-20
  • 打赏
  • 举报
回复
算了,太多了

在 comp.lang.c++.moderated

标题是 layout/ alignment
ckacka 2003-07-20
  • 打赏
  • 举报
回复
这个问题还有一些更多的东西:
如果你感兴趣的话,我粘贴一些东西出来!
晨星 2003-07-19
  • 打赏
  • 举报
回复
p既然是指向node型的指针,则不管它指向哪里,哪怕是空指针、也指针。那块内存都会被当作node类型的来解释,所以取其大小也就必然是sizeof(node)。
事实上,任何node型的指针,哪怕是空指针、NULL。
都可以进行
p->a = 10;
这种操作,只不过通常会引发操作系统的严重错误甚至死机。但如果程序设计者的目的就是要故意引发一个严重错误(比如说搞破坏),那么这也不能算是“错误”。

所以,是否会产生严重错误是一回事,而*p到底是什么类型是另一回事。

但sizeof(*p)不会引发错误,因为它实际上只是求出node类型的大小,它既没有读取p指向的内容,更不会修改p指向的内容。
1cs1ak1 2003-07-19
  • 打赏
  • 举报
回复



谢谢 jishiping(JSP 季世平) 兄。
让我在想想。
谢谢各位。
想通后请大家吃冰棍啊。
呵呵。










jishiping 2003-07-19
  • 打赏
  • 举报
回复
你就假设一个结构数组时的情形,对于结构数组的第二个成员,它的第一个变量需要
对齐的位置,来决定结构数组的第一个成员后面应该补的字节数。如果将结构改为:
typedef struct
{
double a;
char b[5];

char c[4];
}node;

你就可以看出我说的变化了。
jishiping 2003-07-19
  • 打赏
  • 举报
回复
看来我对对齐的认识还不够。刚才又试了一下,知道规律了。结构最后补的字节数,和结构
的第一个变量有关系。因为你的结构的第一个变量,是int(4个字节),当使用4、8......
个字节对齐时,因为int必须对齐到4的倍数,所以整个结构的大小必须4的倍数。结构的第一
个变量类型的对齐,决定整个结构最后补的字节数。
1cs1ak1 2003-07-19
  • 打赏
  • 举报
回复
是啊 ,我也觉得16byte下应为24。
可是输出的是20啊。
修改结构体对齐方式(project->setting->c/c++->categroy->code generation)(vc下)
1cs1ak1 2003-07-19
  • 打赏
  • 举报
回复



vc默认确实为8byte对齐。
在4byte,8byte,16byte三种对齐方式下sizeof(node)都为20
typedef struct
{
int a; //结构的第一个变量,不需要额外做对齐(起始地址已经对齐)
char b[5]; //因为是char,所以可以在任意地址上,不需要补任何数据
char c[8]; //因为是char,所以可以在任意地址上,不需要补任何数据
//上面的数据,加起来为17个字节,结构大小不是4的整数倍,所以需要在
//结构的最后补3个字节,这样结构的大小为20个字节,是4的整数倍。
}node;
4byte确实如上。
8byte,16byte呢?为什么sizeof(node)不是8,16的倍数呢?




jishiping 2003-07-19
  • 打赏
  • 举报
回复
补充说明,如果是BYTE(1个字节)对齐,这个结构的大小为17;如果是WORD(2个字节)
对齐,这个结构的大小为18;如果是DWORD(4个字节)对齐,这个结构的大小为20;如果
是QWORD(8个字节)对齐,这个结构的大小为24。其实这个问题,还不怎么能说明问题。
下面的结构比较能说明问题(在不同的对齐方式下,结构大小会有很大变化,不再是上面
的简单在最后面补一些字节的问题,而是需要在各个变量中间补一些字节):
struct Test
{
char C1;
long L1;
char C2;
WORD W1;
char C3;
double D1;
char C4;
};
linyudie 2003-07-19
  • 打赏
  • 举报
回复
那就为24个byte,为什么sizeof(node)为20啊(和4byte对齐一样了)

int后面没有那4个字节吧??你在debug的时候看一下内存
jishiping 2003-07-19
  • 打赏
  • 举报
回复
没有用过VC,VC应该是DWORD(4个字节)对齐吧。32位操作系统,应该是DWORD对齐最快。
当对齐方式为DWORD对齐时,char、BYTE类型的数据,不需要对齐,而short(WORD)类型
的数据,需要对齐到偶数地址(2的倍数)上,而long、32位程序中的int、DWORD类型的数
据,需要对齐在4的倍数的地址上。而对于结构,整个结构的大小,最后还需要是4的倍数。
根据以上原则:
typedef struct
{
int a; //结构的第一个变量,不需要额外做对齐(起始地址已经对齐)
char b[5]; //因为是char,所以可以在任意地址上,不需要补任何数据
char c[8]; //因为是char,所以可以在任意地址上,不需要补任何数据
//上面的数据,加起来为17个字节,结构大小不是4的整数倍,所以需要在
//结构的最后补3个字节,这样结构的大小为20个字节,是4的整数倍。
}node;
xydrj 2003-07-19
  • 打赏
  • 举报
回复
yes,agree

69,371

社区成员

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

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