帮忙看一下,结构体变量长度的问题,谢谢

simonqsm 2013-06-27 05:04:37
#include<stdio.h>
struct test
{
int m1;double m2;
}myaa;
int main()
{
printf("%d\n",sizeof(struct test));
return 0;
}
这段代码的在VC6.0下运行结果是16,为什么是16,int是4个字节,double是8个字节,不应该是12个字节吗?

...全文
223 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzlhahr 2013-06-29
  • 打赏
  • 举报
回复
内存对齐问题,跟机器的字长有关系
qixing1115 2013-06-29
  • 打赏
  • 举报
回复
N年前我也遇到过这样的问题,看着很高深莫测,现在发现以前的自己是多么 的幼稚
水平不流 2013-06-28
  • 打赏
  • 举报
回复
不要太介意这个问题。要看具体的编译器,和具体的时候,如果想要自己指定对其方式 就加一句 #pragma pack() 括号内写你想要的对其字节。
彭家老三 2013-06-28
  • 打赏
  • 举报
回复
楼主请参考:
http://blog.csdn.net/pengjialaosan/article/details/6903221
_胖胖 2013-06-28
  • 打赏
  • 举报
回复
在默认情况下,为了方便对结构体元素的访问和管理,当结构体内的元素的长度都小于处理器的位数时,便以结构体里最长的数据元素为对齐单位。如果结构体内存在长度大于处理器位数的元素,就以处理器位数为对齐单位。 数据对齐,就是数据所占内存地址必须是该数据长度的整数倍。 int 4, double 8;所以结构体长度应该是8的倍数。比12大的最小整数倍就是16了。
老王爱上猫 2013-06-28
  • 打赏
  • 举报
回复
就是上面说的了,跟字节对齐有关。
AnYidan 2013-06-27
  • 打赏
  • 举报
回复
默认的对齐方式是 struct 中最大的标量数据类型的倍数
自信男孩 2013-06-27
  • 打赏
  • 举报
回复
引用 楼主 simonqsm 的回复:
#include<stdio.h> struct test { int m1;double m2; }myaa; int main() { printf("%d\n",sizeof(struct test)); return 0; } 这段代码的在VC6.0下运行结果是16,为什么是16,int是4个字节,double是8个字节,不应该是12个字节吗?
linux下和windows下对齐方式不一样。在windows下,该结构体的对齐是8字节,在linux下最大的对齐方式是4字节。
starytx 2013-06-27
  • 打赏
  • 举报
回复
搜一下“结构体 字节对齐”就明白了
赵4老师 2013-06-27
  • 打赏
  • 举报
回复
#include <stdio.h>
#define field_offset(s,f) (int)(&(((struct s *)(0))->f))
struct AD  { int a; char b[13]; double c;};
#pragma pack(push)
#pragma pack(1)
struct A1  { int a; char b[13]; double c;};
#pragma pack(2)
struct A2  { int a; char b[13]; double c;};
#pragma pack(4)
struct A4  { int a; char b[13]; double c;};
#pragma pack(8)
struct A8  { int a; char b[13]; double c;};
#pragma pack(16)
struct A16 { int a; char b[13]; double c;};
#pragma pack(pop)
int main() {
    printf("AD.a %d\n",field_offset(AD,a));
    printf("AD.b %d\n",field_offset(AD,b));
    printf("AD.c %d\n",field_offset(AD,c));
    printf("\n");
    printf("A1.a %d\n",field_offset(A1,a));
    printf("A1.b %d\n",field_offset(A1,b));
    printf("A1.c %d\n",field_offset(A1,c));
    printf("\n");
    printf("A2.a %d\n",field_offset(A2,a));
    printf("A2.b %d\n",field_offset(A2,b));
    printf("A2.c %d\n",field_offset(A2,c));
    printf("\n");
    printf("A4.a %d\n",field_offset(A4,a));
    printf("A4.b %d\n",field_offset(A4,b));
    printf("A4.c %d\n",field_offset(A4,c));
    printf("\n");
    printf("A8.a %d\n",field_offset(A8,a));
    printf("A8.b %d\n",field_offset(A8,b));
    printf("A8.c %d\n",field_offset(A8,c));
    printf("\n");
    printf("A16.a %d\n",field_offset(A16,a));
    printf("A16.b %d\n",field_offset(A16,b));
    printf("A16.c %d\n",field_offset(A16,c));
    printf("\n");
    return 0;
}
//AD.a 0
//AD.b 4
//AD.c 24
//
//A1.a 0
//A1.b 4
//A1.c 17
//
//A2.a 0
//A2.b 4
//A2.c 18
//
//A4.a 0
//A4.b 4
//A4.c 20
//
//A8.a 0
//A8.b 4
//A8.c 24
//
//A16.a 0
//A16.b 4
//A16.c 24
//
//
nice_cxf 2013-06-27
  • 打赏
  • 举报
回复
vs系列默认按照8字节对齐,因此结果为16 gcc在32位系统下默认按照4字节对齐,因此结果为12
hugett 2013-06-27
  • 打赏
  • 举报
回复
建议学习一下什么叫内存对齐。。 你在开始的地方加一句
#pragma pack(1)
答案就是12了。。

69,373

社区成员

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

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