首页 > 编程知识 正文

size函数C语言,mallocsizeof

时间:2023-05-03 13:53:49 阅读:118215 作者:4513

sizeof ) sizeof )的用法总结1,sizeof )与定义2,语法形式3,格式书写方式4,strlen )的比较5,结构体的sizeof6,联合体的sizeof7,数组的sizeof8,指针的sizeof9

sizeof ) )的用法总结为1,并定义sizeof ) )

sizeof是操作符。

返回用于计算数据区域字节数的对象或类型所占的内存字节数。

2、语法形式sizeof有三种语法形式:

1 ) sizeof (对象); //sizeof (对象) )

2 ) sizeof对象; //sizeof对象

3 ) sizeof(type_name ); //sizeof (类型) )。

对象可以有各种类型的变量和表达式。 sizeof通常不计算表达式。

sizeof计算对象的内存大小,并最终转换为评估对象的数据类型。

sizeof (式; //值是表达式最终结果的数据类型的大小

3、格式的写法sizeof操作符可以不在变量或对象上加括号,但在类型的情况下必须加括号。

4,strlen ) )进行比较,计算字符数组的字符数,判断为结束于“”,不计算为“”的数组元素。

sizeof计算数据(包括数组、变量、类型、结构等)所占的存储器空间用字节数表示。

5 )结构的sizeof结构的sizeof涉及字节对齐的问题。

为什么需要字节对齐? 计算机的构成原理告诉我们,这样有助于增加计算机的取数。 否则,指令周期会变多。 因此,编译器缺省情况下处理结构,所有宽度为2的基本数据类型(例如,短数据)都位于能被2整除的地址中,所有宽度为4的基本数据类型(例如,int )都位于能被4整除的地址中。 这样,需要在两个数量的中间插入填充字节,从而增加了整个结构的sizeof值。

字节对齐详细信息与编译器的实现有关,但通常满足以下三个准则:

1 )结构变量的起始地址可以被最宽的基本类型成员的大小整除。

2 )结构的每个成员相对于结构的第一地址的偏移是成员大小的整数倍,并且编译器在成员之间添加填充字节(internal adding )。

3 )结构总大小是结构最宽基本类型成员大小的整数倍。 如果需要,编译器将填充字节添加到最后一个成员之后。

注:不包含数据成员的空结构的sizeof值为1。 请考虑“不占空间”变量是如何被寻址的,以及两个不同的“空结构”变量是如何区分的。 这样,还会存储“空结构”变量,编译器只能为占位符分配一个字节的空间。

结构S1 { char a; int b; (; Sizeof(S1; //值为8,对齐字节,在char后填充3个字节。 结构S2 { int b; char a; (; Sizeof(S2; //值为8,对齐字节,在char后填充3个字节。 结构S3 { }; Sizeof(S3; //值为1,空结构也占用内存6,联盟的sizeof结构在内存组织中按顺序推出,联盟为重叠类型,每个成员共享一段内存; 因此,整个联合体的sizeof是每个成员的sizeof的最大值。

union u { int a; 浮点b; 双精度c; char d; (; Sizeof(u; //值为8.7,数组的sizeof数组的sizeof值等于数组消耗的存储器字节数。

注意:

1 )如果字符数组表示字符串,则其sizeof值计算’/0’。

2 )数组为参数时,其sizeof值相当于指针的sizeof值。

char a[10]; char n[]='abc '; cout'chara[10]'sizeof(a ) endl; //数组,值为10 cout ' charn [ ]=/' ABC/' ' sizeof (n ) endl; //字符串数组,计算“/0”,值为4 void func (chara [3] a ); //c=4。 在这里,a不是数组类型,而是指针,所以相当于char *a。 }voidfuncn(charb[] ) intcn=sizeof ) b; //cN=4,理由相同。 } 8、指针的sizeof指针用于记录另一个对象的地址,所以指针的内存大小当然与计算机内部地址总线的宽度相同。

在32位计算机上,指针变量的返回值必须为4。

指手画脚

针变量的sizeof值与指针所指的对象没有任何关系。

char *b = "helloworld"; char *c[10]; double *d; int **e; void (*pf)(); cout<<"char *b = /"helloworld/" "<<sizeof(b)<<endl;//指针指向字符串,值为4 cout<<"char *b "<<sizeof(*b)<<endl; //指针指向字符,值为1 cout<<"double *d "<<sizeof(d)<<endl;//指针,值为4 cout<<"double *d "<<sizeof(*d)<<endl;//指针指向浮点数,值为8 cout<<"int **e "<<sizeof(e)<<endl;//指针指向指针,值为4 cout<<"char *c[10] "<<sizeof(c)<<endl;//指针数组,值为40 cout<<"void (*pf)(); "<<sizeof(pf)<<endl;//函数指针,值为4 9, 函数的sizeof

sizeof也可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。

对函数求值的形式:sizeof(函数名(实参表))

注意:1)不可以对返回值类型为空的函数求值。

2)不可以对函数名求值。 3)对有参数的函数,在用sizeof时,须写上实参表。 #include <iostream> using namespace std; float FuncP(int a, float b) { return a + b; } int FuncNP() { return 3; } void Func() { } int main() { cout<<sizeof(FuncP(3, 0.4))<<endl; //OK,值为4,sizeof(FuncP(3,0.4))相当于sizeof(float) cout<<sizeof(FuncNP())<<endl; //OK,值为4,sizeof(FuncNP())相当于sizeof(int) /*cout<<sizeof(Func())<<endl; //error,sizeof不能对返回值为空类型的函数求值*/ /*cout<<sizeof(FuncNP)<<endl; //error,sizeof不能对函数名求值*/ return 0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。