有关sizeof的问题(结构体)

供稿:hz-xin.com     日期:2025-01-15
关于sizeof结构体大小的问题

肯定不对呀

在缺省对齐下我先给你说下三条准则吧,
【1】结构体变量的首地址能够被其最宽基本类型成员的大小所整除
【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背
【3】结构体的总大小为结构体最宽基本类型成员大小的整数背
以上都是结构体中只有基本类型时的缺省对齐方式,当有嵌套复合成员时,
【2】改为:复合成员相对于结构体首地址偏移量是复合成员最宽基本类型大小的整数背
所以分析你上面的
typedef struct node
{
int a[100];
char b;
}kkk;
先是第一成员400个字节,然后还有个char一个字节,为了满足第第三条准则,即总大小401为最宽基本类型的整数背,明显401不是最宽基本类型int(4)的整数背,所以总大小为404

再分析一个
typedef struct node
{
int a;
char b;
char c;
char d;
char e;
}kkk;
先是第一成员4个字节,第2---5成员1个字节,总共8个字节,满足要求。
如果按照你的错误理解,那么这个结构体就是20个字节了,显然是错误的。

希望楼主能理解,呵呵

第一种方式定义结构体指针必须是
struct student * pStu = NULL;


第二种方式才可以使用
student * pStu=NULL;


当pStu是指针时,sizeof(pStu);的大小是 4(32位操作系统) 或者 8(64位操作系统),因为他的类似是指针,所有的指针,本质上都是一个整数,所以不管是什么类似的指针的sizeof的值都是一样的


一个结构体型的应该是包含 struct 关键字和 结构体名的,如你这个例子
typedef struct student student;
只是相当于告诉编译器 student 就是 struct student,编译器编译的时候会自动把他当成sturct student, 因此当你的结构体定义使用了typedef 的时候才能直接使用student当成结构体类型

memset(pStu ,0,sizeof(student)); // 当你使用了typedef struct student student;时,这句话才是对的
memset(pStu ,0,sizeof( struct student)); //如果你没有使用typedef,就只能用这种方法

8 8 12
sizeof(a)=sizeof(m1)+sizeof(m2)=4+4
sizeof(b) = sizeof(m1)+sizeof(m2) =4+1 但是,static不算,并且内存对齐,也就是必须是占内存最多的那个量的倍数,即sizeof(m1)的倍数,即2*4=8>5,所以选8
sizeof(c)=sizeof(*)+sizeof(m1)+sizeof(m2)=4+4+4 虚函数存在代表一个指针用,所以用sizeof(*),指针大小是4.
ps:都要内存对齐,但是第一个第三个已经对齐了。

结果依次是 8 , 8 , 12
环境是VS2010
源码如下:
#include <iostream>
struct A
{
A();
~A();
int m1;
int m2;
}a;

struct B
{
B();
~B();
int m1;
char m2;
static char m3;
}b;

struct C
{
C();
virtual ~C();
int m1;
int m2;
}c;

A::A(){};
B::B(){};
C::C(){};
A::~A(){};
B::~B(){};
C::~C(){};

int main()
{
A a;
B b;
C c;
int x =sizeof(a);
int y =sizeof(b);
int z =sizeof(c);
std::cout<<"x="<<x<<" y="<<y<<" z="<<z;
getchar();
return 0;
}

按高位补齐

请教vb.net Marshal.SizeOf取结构体长度的问题,谢谢
o这是因为有字节对齐的问题。每一个变量的首地址必须是它所占字节长度的倍数。比如int32长度是4,那么它的首地址只能取0,4,8,12……下面的图形象的表示了MSG在内存中的储存情况:OOXXOOOO 第一个和第二个O表示两个BYTE类型的数据,两个X表示空地址,里面什么也没放。后面四个OOOO便是一个int32...

C语言中结构体问题
结构体`stru_type`的`sizeof`值为24,意味着它包含多个不同类型的成员,这些成员被优化地排列以满足对齐规则,并且整个结构体共占用24个字节的内存空间。具体包含哪些成员以及它们的类型和大小,将直接影响最终的`sizeof`值。理解结构体字节对齐的原理对于优化程序性能至关重要。在编写代码时,避免使用未...

关于sizeof
sizeof(str)是8,其中中文一个汉字是2个字节 sizeof(SYS)这个得看你什么编译器了,而且也是可以控制其字节对齐的 当前大部分软件默认情况下32位对齐,结果就是8了 如果 pragma pack(1)typedef struct sysinfo { char Cover;int * ptoal;}SYS;pragma pack()自然就是5字节了 而放到16位单片机开发...

c语言中sizeof的意思是什么下面这道题的答案是什么,请解释一下_百度知...
sizeof是指这个数据类型分配的单元内存大小,比如int 是4,等等,所以sizeof(struct date)=4+4+4=12, union类型比较特殊,它的长度大小时内部成员中最大的一个的长度,所以sizeof(m)是其中long的值,也就是8

请问:单目运算符sizeof()如何实现对不同类型的变量,结构进行大小测量...
int i;\/\/偏移量为1, 结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍),故偏移量应为4 char c2;\/\/偏移量为8(偏移量4+int大2小4),符合要求 } 算出sizeof( stu3 )=1+8=9,但9不是int的整数倍故最终大小为12 struct stu4 { char c1; \/\/偏移量为0...

...a[98]; union U uu[2];}; 求解为什么sizeof(S)为116
这是结构体字节对齐问题 union U{ float f; double d;}; 是联合体,所以变量共用一个内存空间,取最大的,float四个字节,double是8个字节,所以sizeof(U)=8;struct S{ char a[98]; \/\/先分配98个字节,如果结构体中全是char类型,则结构体大小就是char的字节数 union U uu[2]; \/\/到...

用sizeof函数求出来的结构体名字的长度和结构体变量的长度有什么区别...
include <stdio.h> struct node { int data;struct node *next;};struct node lnode;int main(){ printf("struct node size = %d\\n",sizeof(struct node));printf("node size = %d\\n",sizeof(node));printf("lnode size = %d\\n",sizeof(lnode));return 0;} 输出:struct node ...

C语言中用结构体类型构造结点,结点及数组名占用内存的问题
有一点你要搞清楚,就是32位的机子上,不管什么指针,都是4字节(4×8bit=32bit,即32位),所以sizeof(next)是4字节,因为next是指针。还有一个概念是“字节对齐”,详细的话可以到网上搜一下。基本准则是这样的:字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:1) 结构体变量...

...S{ int g; char h; float *pf;};,则该sizeof(struct S)的结果是...
整形+字符型+指针,整形:2字节(turbo C2.0) 4字节(visual C++);字符型:1字节;指针:2字节(turbo C2.0) 4字节(visual C++),结构体S一共是2+1+2=5字节,但计算机对内存管理是以“字”为单位,1个字为4个字节,所以用sizeof函数得到的长度必然是4的倍数,故sizeof(struct S)不...

C语言结构体长度字节对齐问题
include <stdio.h>struct chji{char name[9];int number;char sex;double score;float aa;};struct chji stu;int main(){printf("sizeof(struct chji)=%d\\n",sizeof(struct chji));return 0;}运行结果:sizeof(struct chji)=40 如果要按单个字节的长度来对齐的话,代码如下:include <stdio....