帮看看内存对齐问题。。

井白人 2009-07-24 10:33:32

#include "stdio.h"

struct T
{
int a;
union D
{
int b;
double c;
}pt;
T *d[2];
}str;

int main()
{
printf("%d\n",sizeof(str));//结果为24
printf("%d\n",sizeof(str.pt));//结果为8
printf("%d\n",sizeof(str.d));//结果为8
return 0;
}

上述由于内存对其可以理解,而下面就让我迷糊了

#include "stdio.h"

struct T
{
int a;
union D
{
int b;
double c;
}pt;
T *d[2];
}str;

int main()
{
printf("%d\n",sizeof(str));//结果为24,
printf("%d\n",sizeof(str.d));//结果为8
return 0;
}

内存对齐理解。。
而下面却迷惑不解,为什么呢?


#include "stdio.h"

struct T
{
int a;
union D
{
int b;
double c;
};//此处去掉union变量pt,
T *d[2];
}str;

int main()
{
printf("%d\n",sizeof(str));//结果为12,迷惑不解,为什么呢?
printf("%d\n",sizeof(str.d));//结果为8
return 0;
}

第二个程序代码如果内存对齐的话不应该是12啊?
为什么会有这种情况产生呢?
请教。。
...全文
57 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ice50303 2009-07-24
  • 打赏
  • 举报
回复
#include "stdio.h"

struct T
{
int a;
union D
{
int b;
double c;
}*pT; //此处变为指针
T *d[2];
}str;

int main()
{
printf("%d\n",sizeof(str)); //
printf("%d\n",sizeof(str.d)); // 你再看看结果呢~
return 0;
}
井白人 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mstlq 的回复:]
没问题啊
str.a是4
str.b[0]是4
str.b[1]是4
加起来12……


union D
{
int b;
double c;
};
这个只是一个声明,没有定义任何变量,不占任何空间^_^
[/Quote]
惭愧。。。
井白人 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hikaliv 的回复:]
http://blog.csdn.net/hikaliv/archive/2009/06/03/4239352.aspx

关于内存对齐请看这个。

至于 str,a 四字节,T* 是指针,是四字节,两个就是八字节,故而是十二字节,没有问题。
[/Quote]

那共用体呢?不占内存?
mstlq 2009-07-24
  • 打赏
  • 举报
回复
没问题啊
str.a是4
str.b[0]是4
str.b[1]是4
加起来12……


union D
{
int b;
double c;
};
这个只是一个声明,没有定义任何变量,不占任何空间^_^
光宇广贞 2009-07-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/hikaliv/archive/2009/06/03/4239352.aspx

关于内存对齐请看这个。

至于 str,a 四字节,T* 是指针,是四字节,两个就是八字节,故而是十二字节,没有问题。

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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