★深入解析sizeof操作符★
对C语言中的sizeof的介绍分析

对C语言中的sizeof的介绍分析对C语言中的sizeof的介绍分析引导语::sizeof是C语言中判断数据类型或者表达式长度符,以下是店铺分享给大家的对C语言中的sizeof的介绍分析,欢迎阅读!1.定义sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数。
返回值类型为size_t,在头文件stddef.h中定义。
这是一个依赖于编译系统的值,一般定义为typedef unsigned int size_t;编译器林林总总,但作为一个规范,都会保证char、signed char和unsigned char的sizeof值为1,毕竟char是编程能用的最小数据类型。
MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or atype (including aggregate types). This keyword returns a value of typesize_t.2. 语法:sizeof有三种语法形式,如下:1) sizeof( object ); // sizeof( 对象 );2) sizeof( type_name ); // sizeof( 类型 );3) sizeof object; // sizeof 对象;所以一下三种sizeof的使用都是对的复制代码代码如下:#includemain(){int b;printf("%dn",sizeof b);printf("%dn",sizeof(b));printf("%dn",sizeof(int));}3. 基本数据类型的sizeof这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成麻烦。
sizeof用法

sizeof用法sizeof是C/C++语言中非常常用的一个操作符,用于计算数据类型或变量在内存中所占的字节数。
本文将从使用方法、注意事项、应用场景等方面进行详细讲解。
1.使用方法sizeof操作符有两种用法:(1)计算数据类型在内存中所占的字节数语法:sizeof(数据类型)例子:sizeof(int)(2)计算变量在内存中所占的字节数语法:sizeof(变量名)例子:int a; sizeof(a)2.注意事项(1)sizeof操作符计算的字节数只与数据类型相关,与具体的实现相关性较小。
(2)对于数组,sizeof计算的是整个数组所占的字节数,而不是指向数组首元素的指针所占的字节数。
(3)对于指针,sizeof计算的是指针本身所占的字节数,而不是指针指向对象所占的字节数。
(4)通过结构体、共用体等数据类型可以自定义复合类型,sizeof计算的是整个数据类型所占的字节数。
(5)sizeof操作符是在编译时计算,不会对程序运行造成任何影响。
3.应用场景(1)动态内存分配在进行动态内存分配时,需要根据数据类型的大小决定分配的内存空间大小。
使用sizeof操作符可以方便地获取数据类型的大小,从而确定需要分配的内存大小。
(2)指针运算对指针进行加减运算时需要知道指针指向对象的大小,从而确定加减的偏移量。
使用sizeof操作符可以获取指针指向对象的大小。
(3)复合类型处理在处理复合类型数据时,需要知道整个数据类型所占的字节数,从而方便进行内存分配、指针运算等操作。
使用sizeof操作符可以获取复合类型数据的大小。
(4)调试和分析在进行程序调试和性能分析时,需要了解数据类型在内存中的存储情况,使用sizeof操作符可以获取数据类型在内存中所占的字节数,进而方便进行调试和分析。
总之,sizeof操作符是C/C++语言中非常重要的操作符,在程序开发、调试和分析中都具有重要作用。
需要注意的是,在使用sizeof操作符时需要注意相关的注意事项,才能正确无误地进行操作。
sizeof深入理解(vcbase)

sizeof深入理解(vcbase)∙ 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
∙ 2.sizeof是算符,strlen是函数。
∙ 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,比如:∙short f();∙printf("%d\n", sizeof(f()));输出的结果是sizeof(short),即2。
∙ 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
∙ 5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因∙char str[20]="0123456789";∙int a=strlen(str); //a=10;∙int b=sizeof(str); //而b=20;∙ 6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。
∙7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。
这是因为sizeof是个操作符不是个函数。
∙8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸∙9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如:∙fun(char [8])∙fun(char [])都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy 拷贝出来,长度由另一个形参传进去fun(unsiged char *p1, int len){unsigned char* buf = new unsigned char[len+1]memcpy(buf, p1, len);}有关内容见: C++ PRIMER?∙10.计算结构变量的大小就必须讨论数据对齐问题。
sizeof在c语言中的用法 (2)

sizeof在c语言中的用法一、sizeof在C语言中的用法简介在C语言中,sizeof是一个用来获取数据类型或变量在内存中所占字节数的运算符。
它返回一个无符号整数值,表示所给参数的大小。
sizeof可以用于各种数据类型,包括基本数据类型(如int、float等)、指针、数组和结构体等。
二、sizeof用法详解1. 获取基本数据类型的大小使用sizeof运算符可以获取C语言中各种基本数据类型的大小。
例如,sizeof(int)将返回该机器上int类型所占的字节数。
这对于编写可移植性强的代码非常有用。
2. 获取数组大小通过使用sizeof运算符,可以获取数组在内存中所占空间的大小。
例如,如果有一个整型数组arr,则sizeof(arr)将返回该数组所占的总字节数。
3. 获取指针变量的大小当使用sizeof运算符计算指针变量时,它将返回指针变量本身所占空间的大小,并不会计算指针所引用对象的大小。
这是因为指针只是一个地址值,在32位操作系统上通常占用4个字节,在64位操作系统上通常占用8个字节。
4. 获取结构体大小通过使用sizeof运算符,可以获取结构体在内存中所占空间的大小。
结构体由多个字段组成,而每个字段又可以是不同的数据类型。
sizeof(struct_name)将返回该结构体所占的总字节数。
5. 计算变量的大小sizeof运算符可以用于计算变量在内存中所占空间的大小。
例如,sizeof(variable)将返回变量所占的字节数。
这在动态分配内存或者进行数据传输时非常有用。
6. 获取字符串长度使用sizeof运算符可以获取字符串(字符数组)在内存中所占空间的大小,包括末尾的空字符'\0'。
例如,如果有一个字符数组str,则sizeof(str)将返回该数组所占空间的总字节数。
7. 特殊情况注意事项在使用sizeof运算符时需要特别注意一些情况。
首先,在计算指针变量时,需要明确指针类型,因为不同类型的指针在不同平台上可能占用不同大小的空间。
c语言 sizeof 结构体指针

c语言 sizeof 结构体指针
在C语言中,sizeof操作符用于获取数据类型或变量的大小,
而结构体指针是指向结构体变量的指针。
当我们使用sizeof操作符
来获取结构体指针的大小时,实际上是获取指针变量的大小,而不
是指向的结构体的大小。
在C语言中,结构体指针的大小与指针变量的大小相同,通常
是与系统的位数相关的固定大小。
例如,在32位系统中,指针的大
小通常是4个字节,在64位系统中,指针的大小通常是8个字节。
这意味着无论结构体的大小是多少,结构体指针的大小都是固定的。
结构体指针的大小并不取决于结构体本身的大小,而是取决于
系统架构和编译器的实现。
因此,无论结构体的大小如何,结构体
指针的大小都是固定的。
需要注意的是,结构体指针的大小与结构体本身的大小是不同
的概念。
结构体的大小取决于其成员变量的大小和对齐方式,而结
构体指针的大小只取决于系统架构和编译器的实现。
总之,当你使用sizeof操作符来获取结构体指针的大小时,你
实际上获取的是指针变量的大小,而不是指向的结构体的大小。
这一点在内存分配和指针运算时需要特别注意。
详细解析sizeof()

一、sizeof的概念sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。
它并不是函数。
sizeof操作符以字节形式给出了其操作数的存储大小。
操作数可以是一个表达式或括在括号内的类型名。
操作数的存储大小由操作数的类型决定。
二、sizeof的使用方法1、用于数据类型sizeof使用形式:sizeof(type)数据类型必须用括号括住。
如sizeof(int)。
2、用于变量sizeof使用形式:sizeof(var_name)或sizeof var_name变量名可以不用括号括住。
如sizeof (var_name),sizeof var_name等都是正确形式。
带括号的用法更普遍,大多数程序员采用这种形式。
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。
不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
如sizeof(max)若此时变量max定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知,sizeof(void)都不是正确形式。
三、sizeof的结果sizeof操作符的结果类型是size_t,它在头文件中typedef为unsignedint类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
1、若操作数具有类型char、unsigned char或signed char,其结果等于1。
ANSI C正式规定字符类型为1字节。
2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。
sizeof在c++中用法

sizeof在c++中用法
(实用版)
目录
1.sizeof 的定义与作用
2.sizeof 的基本语法
3.sizeof 的运算规则
4.sizeof 的应用示例
正文
【1.sizeof 的定义与作用】
sizeof 是 C++语言中用于获取数据类型或变量大小的关键字,它返回的是一个整数值,表示数据类型或变量在内存中所占用的字节数。
在程序设计中,了解数据类型或变量的大小对于优化程序性能、避免内存浪费和处理数据时非常必要的。
【2.sizeof 的基本语法】
sizeof 的基本语法如下:
```
sizeof(数据类型或变量);
```
其中,数据类型或变量可以是基本数据类型如 int、float,也可以是复合数据类型如数组、结构体、联合体等。
【3.sizeof 的运算规则】
1.对于基本数据类型,sizeof 返回的值等于该数据类型的大小,如int 为 4,float 为 4,double 为 8。
2.对于复合数据类型,sizeof 返回的值等于该数据类型所占用的最大内存空间。
例如,数组返回的是数组所占用的总空间大小,结构体返回的是结构体所占用的最大空间大小。
3.对于指针类型,sizeof 返回的值等于指针的大小,通常为 4(32 位系统)或 8(64 位系统)。
4.对于数组,sizeof 返回的是数组所占用的总空间大小,而不是数组中元素的大小。
5.对于函数返回值类型,sizeof 返回的是函数返回值所占用的字节数。
c语言中sizeof的含义

c语言中sizeof的含义
在C语言中,sizeof是一个用于计算数据类型或变量占用字节大小的运算符。
它可以被用于计算任何数据类型、变量或表达式的大小。
sizeof运算符返回的结果
是一个无符号整数,表示指定对象所占用的字节数。
使用sizeof运算符可以帮助程序员在编写代码时更好地控制和管理内存。
在计
算数据类型的大小时,它会考虑编译器对类型所做的对齐和填充处理。
这意味着sizeof运算符返回的结果可能会比直观的数据类型大小略大。
sizeof运算符主要有两种用法:
1. sizeof(数据类型)
这种用法可以用来计算指定数据类型所占用的字节数。
例如,sizeof(int)将返
回整数类型(int)在当前平台上所占用的字节数。
这对于确定数据类型的字节大小非
常有用,特别是在编写与底层内存相关的代码时。
2. sizeof(变量或表达式)
这种用法将返回指定变量或表达式的字节数。
例如,如果有一个整数变量x,我们可以使用sizeof(x)来计算变量x所占用的字节数。
同样地,我们也可以使用sizeof(x + 1)来计算表达式(x + 1)的字节数。
需要注意的是,sizeof运算符在编译时计算大小,而不是运行时。
这意味着它
可以用于计算静态分配的数组大小,但无法用于动态分配的内存块的大小。
总结起来,C语言中的sizeof运算符用于计算数据类型、变量或表达式所占用
的字节数。
它是一个在编译时计算大小的运算符,可以帮助程序员更好地管理内存。
在编写底层或与内存相关的代码时,了解和正确使用sizeof运算符非常重要。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3. 不适用场合 sizeof 操作符不能用于不完全类型定义,例如数组必须有确定的维数,结构体有完整的 成员列表定义。 例: extern int arr[]; struct s; sizeof(arr); // Error sizeof(s); // Error 4. 一般用法 1) 2) 3) 4) 5) 6) 7) cout<<sizeof(int); // 4 double d; cout<<sizeof(d); // 8 char str[]=”0123456789”; cout<<sizeof(str); // 11(注意字符串的结束字符’\0’) char str[100]=”0123456789”; cout<<sizeof(str); // 100 char *p=”0123456789”; cout<<sizeof(p); // 4(p 的类型是字符指针) char *p=(char *)malloc(100); cout<<sizeof(p); // 4(同上) string str(“0123456789”); cout<<sizeof(str.c_str()); // 4(同上)
★深入解析 sizeof 操作符★
更新日期:08/20/2010 1. 描述 sizeof 操作符以字节形式给出了其操作数的存储空间,操作数的存储空间有操作数的类 型决定。操作数可以是变量、类型(需加括号)或表达式。 2. 使用场合 1) 2) 动态分配内存时,计算需要分配的内存空间大小 由于不同平台相同类型的所占的字节数不同,可以使用 sizeof 代替常量计算
6. 高级用法之——struct 的空间计算 总体上遵循三个原则(即内存对齐原则) : (1) 结构体变量的起始地址是占用空间最大的成员(的类型)所占字节数的整倍数 (2) 整体空间是占用空间最大的成员(的类型)所占字节数的整倍数 (3) 内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小 必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。 注意: 数组按照单个变量一个一个的摆放, 而不是看成整体。 如果成员中有自定义的类、 结构体,也要注意数组问题。 看下面的例子:(默认对齐方式下) struct s1 { char a; double b; int c; char d; }; struct s2 { char a; char b; int c; double d; }; cout<<sizeof(s1)<<endl; // 24 cout<<sizeof(s2)<<endl; // 16 同样是两个 char 类型,一个 int 类型,一个 double 类型,但是因为对齐问题,导致他们 的大小不同。计算结构体大小可以采用元素摆放法,我举例子说明一下:首先,CPU 判断 结构体的对界,根据上一节的结论,s1 和 s2 的对界都取最大的元素类型,也就是 double 类 型的对界 8。然后开始摆放每个元素。 对于 s1,首先把 a 放到 8 的对界,假定是 0,此时下一个空闲的地址是 1,但是下一个 元素 d 是 double 类型,要放到 8 的对界上,离 1 最接近的地址是 8 了,所以 d 被放在了 8, 此时下一个空闲地址变成了 16,下一个元素 c 的对界是 4,16 可以满足,所以 c 放在了 16, 此时下一个空闲地址变成了 20,下一个元素 d 需要对界 1,也正好落在对界上,所以 d 放在 了 20, 结构体在地址 21 处结束。 由于 s1 的大小需要是 8 的倍数, 所以 21-23 的空间被保留, s1 的大小变成了 24。 对于 s2,首先把 a 放到 8 的对界,假定是 0,此时下一个空闲地址是 1,下一个元素的 对界也是 1,所以 b 摆放在 1,下一个空闲地址变成了 2;下一个元素 c 的对界是 4,所以取 离 2 最近的地址 4 摆放 c,下一个空闲地址变成了 8,下一个元素 d 的对界是 8,所以 d 摆 放在 8,所有元素摆放完毕,结构体在 15 处结束,占用总空间为 16,正好是 8 的倍数。 这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小,看 下面的例子:
5. 高级用法之——数组的空间计算 数组和指针的 sizeof 运算有着细微的区别。如果数组变量被传入函数中做 sizeof 运算, 则和指针的 sizeof 运算相同,否则会得到整个数组占用内存的总大小。这是因为数组变 量在作为参数传递时会被隐式转换为指针。 例: char str[] = “0123456789”; cout<<sizeof(str); // 11 void func(char str[]) { cout<<sizeof(str); // 4 }
class Derived: public Base{ public: virtual void print() {}; virtual void print2() {}; private: int b; }; cout<<sizeof(Base); // 8(Base.a + 虚函数表指针) cout<<sizeof(Derived); // 12(Base.a + Derived.b + 虚函数表指针) 4)虚继承 对于虚继承的类, 系统会为子类安插一个指向父类的指针, 如果有多个虚继承的父类则 有多个这样的指针。 例: class A{}; class B{}; class C:virtual public A, virtual public B {}; cout<<sizeof(A); // 1(空类) cout<<sizeof(B); // 1(空类) cout<<sizeof(C); // 8(指向 A 的指针 + 指向 B 的指针) 10. 与 strlen()比较 1) 2) sizeof 是操作符, 结果类型为 size_t(unsigned int), 而 strlen 是函数, 返回类型为 size_t。 sizeof 计算数据(包括变量和类型)所占内存空间(需考虑内存对齐) ,用字节数表 示;strlen 只能用以字符’\0’结尾的字符串作参数,计算字符串的字符数(不包括结 尾字符’\0’) 。 sizeof 的值在编译阶段求得,而 strlen 要在运行时才能求得结果。 数组在作为 sizeof 的操作数时,不会隐式转换为指针;而在传递给 strlen 时就隐式 转换为指针。
int b; }; cout<<sizeof(u2); // 16(字节对齐数为 4) 8. 高级用法之——位域的空间计算 在结构体和类中, 可以使用位域来规定某个成员所能占用的空间, 所以使用位域能在一 定程度上节省结构体占用的空间。不过考虑下面的代码: struct s1 { int i: 8; int j: 4; double b; int a:3; }; struct s2 { int i; int j; double b; int a; }; struct s3 { int i; int j; int a; double b; }; struct s4 { int i: 8; int j: 4; int a:3; double b; }; cout<<sizeof(s1)<<endl; // 24 cout<<sizeof(s2)<<endl; // 24 cout<<sizeof(s3)<<endl; // 24 cout<<sizeof(s4)<<endl; // 16 可以看到,有 double 存在会干涉到位域,所以使用位域的的时候,最好把 float 类型和
double 类型放在程序的开始或者最后。 9. 高级用法之——类的空间计算 1)空类 每个类的实例(空类也可以生产实例对象)在内存中都有一个独一无二的地址,为了达 到这个目的, 编译器往往会给一个空类隐含的加一个字节 (不同编译器增加的字节数可能不 一样) ,这样空类在实例化后在内存得到了独一无二的地址。 例(gcc 4.3.4) : class A {}; class B {}; class C {}; cout<<sizeof(A); // 1(不同编译器可能不一样) cout<<sizeof(B); // 1 cout<< sizeof(C); // 1 A a; B b; C c; cout<<&a; // 0x22cd53(具体地址值可能不同) cout<<&b; // 0x22cd52 cout<<&c; // 0x22cd51 2)静态成员变量 在计算类的大小时, 除了考虑内存对齐问题外, 由于静态成员变量不属于类的任何一个 实例,而是存放在全局数据区被类共享,并不计算在类大小里面,我们可以把类的静态成员 变量当做一个特殊的全局变量。例: calss A{ public: int i; static double d; A(); ~A(); } cout << sizeof(A) << endl; // 4 3)虚函数 在计算类的大小时, 如果该类有虚函数, 则系统会维护一个指向该类的虚函数表的指针, 每个表项对应着一个虚函数。 例: class Base{ public: virtual void print() {}; private: int a; };
struct s1 { char a[8]; }; struct s2 { double d; }; struct s3 { s1 s; char a; }; struct s4 { s2 s; char a; }; cout<<sizeof(s1)<<endl; // 8 cout<<sizeof(s2)<<endl; // 8 cout<<sizeof(s3)<<endl; // 9 cout<<sizeof(s4)<<endl; // 16; s1 和 s2 大小虽然都是 8,但是 s1 的对齐方式是 1,s2 是 8(double) ,所以在 s3 和 s4 中才有这样的差异。 所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体 里的元素。 7. 高级用法之——union 的空间计算 整体空间大小是占用空间最大的成员所占字节数。例 1: union u{ int i; char c; float f; double d; short s; }; cout << sizeof(u); // 8 例 2: Union u2{ char arr[13];