
本节包含sizeof()的计算结构,位字段,数组,字符串,指针,C ++中的类大小等. sizeof(of)的计算单位为字节.
一个计算基本类型的长度
sizeof(char): 1
sizeof(short): 2
sizeof(int): 4
sizeof(long): 4(win X86和win X64的长度为4,Linux X86的长度为4,Linux X64的长度为8)
sizeof(float): 4
sizeof(double): 8
sizeof(bool): 1(在C ++中,长度为4)
sizeof(BOOL): 4(在Windows平台上为4)
sizeof(p): 指针类型在X86中为4,在X64中为8,例如char * p
2计算结构的长度
要正确计算sizeof(结构)的大小,您需要了解并掌握数据对齐的概念. 数据对齐的概念是在以前的数据对齐以及内存中的自然对齐和强制对齐中引入的.
关键是要记住自然对齐和强制对齐的对齐规则,并且很容易计算sizeof(结构)的大小.
3计算数组的长度
char str [] =“ hello”; sizeof(s)大小
1一般情况

str是一个字符数组,由字符串“ hello”,“ hello”初始化;总共5个字符,字符串以'\ 0'结尾. 所以str数组的长度是6
sizeof(s)是6
2个str数组作为函数参数
在函数中,数组str作为参数传递,而str在函数内部采用指针形式. 所以:
sizeof是4X86平台
sizeof是8X64平台
四个计算并集长度
使用sizeof计算联合类型时,整个联合结构的大小等于联合中最大成员的大小,并且必须是最大类型的整数倍.
例如:
typedef联合
{
我很长
int k [5];
字符c;
}日期;
结构数据
{
![]()
int cat;
DATE牛;
双狗;
}也是
DATE最大值; sizeof(结构数据)=?sizeof(max))=?
分析:
由于max是联合DATE类型,因此最大成员为k,因此sizeof(MAX)= k成员长度= 5 * sizeof(int)= 20
对于struct数据结构,根据自然对齐方法,计算结果为: sizeof(struct data)= 4 + 20 + 8 = 32
五个计算位字段结构的大小
位字段结构的大小在位字段(位段)中引入.
六计算类和对象的大小(在C ++中)
class A { public: A(); ~A(); private: }; void main() { printf("sizeof(A): %d\n", sizeof(A)); getchar(); }
sizeof(A)=1. 因为类的实例化是为每个实例在内存中分配一个内存地址. 实例化一个空类时,编译器将隐式添加一个字节计算结构体大小,因此为1.
class B { void fn1(); void fn2(); protected: char a; char b; int c; static int d; };
sizeof(B)= 8
B类中最大的类型是int. a的长度为1个字节,b的长度为1个字节. int类型c的内存地址必须被4整除. 静态变量d不会影响类的大小.
因此sizeof(B)=变量a的长度1 + b的长度1 +对齐2字节+变量c的长度4字节= 8

class A { protected: int a; private: int b; }; class B :public A { private: int c; };
sizeof(B)= 12 B继承了A,因此B包含A中的所有数据,大小是A 8中的大小+ B 4中的大小= 12
class C { virtual void fun(){} };
sizeof(C)= 4,因为类C包含指向虚拟函数表的指针.
class D { virtual void fun1() {} virtual void fun2() {} };
sizeof(D)= 4多个虚拟函数只需要一个指向虚拟函数表的指针
7个大小和长度
char * p1 =“ 12345678”;
char p2 [] =“ 12345678”;
char p3 [1024] =“ 12345678”;
char p4 [] = {'1','2','3','4','5','6','7','8'};
sizeof(p1)=?
sizeof(p2)=?
sizeof(p3)=?
sizeof(p4)=?
strlen(p1)=?
strlen(p2)=?

strlen(p3)=?
strlen(p4)=?
分析:
p1是一个字符指针,指向静态常量区域“ 12345678”中的常量字符串. 因此,sizeof(p1)=指针的长度= 4; strlen(p1)=字符串“ 12345678”的长度(不包括“ \ 0”),因此为8.
p2是一个字符数组,在静态常量区域中由“ 12345678”初始化. 因此sizeof(p2)是要计算数组p2的长度,因此结果是所有字符“ 12345678”(包括'\ 0')的长度,所以它是9. strlen(p2)也在计算长度“ 12345678”(不包括'\ 0'),因此为8.
p3是一个字符数组,在静态常量区域中由“ 12345678”初始化,但长度为1024. 因此,sizeof(p3)= 1024; strlen(p3)是字符串“ 12345678”的长度(不包括'\ 0'),因此为8.
p4是一个字符数组,由字符“ 1”,“ 2”,“ 3”,“ 4”计算结构体大小,“ 5”,“ 6”,“ 7”,“ 8”初始化. 表示前者不包含'\ 0',因此sizeof(p4)= 8. 由于p4是字符数组,因此不以'\ 0'结尾,因此当strlen(p4)计算字符串的长度时,它找不到结尾字符'\ 0',并且会发生字符串溢出.
所以,最后的答案是:
sizeof(p1)= 4
sizeof(p2)= 9
sizeof(p3)= 1024
sizeof(p4)= 8
strlen(p1)= 8
strlen(p2)= 8
strlen(p3)= 8
strlen(p4)=字符串溢出,该值不确定,甚至导致程序崩溃
其他八码
问题1: 请设计一个宏来计算数组的长度.
解决方案: #define ARRAYLEN(a)sizeof(a)/ sizeof(a [0])
问题2: sizeof是函数吗?是在程序编译时还是运行时计算的?
解决方案: sizeof是运算符而不是函数. sizeof是在编译程序时计算的,而不是在程序运行时计算的.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-250169-1.html
内抓汉奸
四
但伊拉克必须要只效忠美国且永远不许对他国抛媚眼示好