`
阿尔萨斯
  • 浏览: 4185734 次
社区版块
存档分类
最新评论

C语言中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定义为intmax(),sizeof(char_v) 若此时char_v定义为charchar_v [MAX]且MAX未知,sizeof(void)都不是正确形式。

三、sizeof的结果

sizeof操作符的结果类型是size_t它在头文件中typedefunsignedint类型。该类型保证能容纳实现所建立的最大对象的字节大小。

1、若操作数具有类型char、unsignedchar或signed char,其结果等于1.

ANSIC正式规定字符类型为1字节。

2、int、unsignedint 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSIC中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10.

3、当操作数是指针时,sizeof依赖于编译器。例如MicrosoftC/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4.一般Unix的指针字节数为4.

4、当操作数具有数组类型时,其结果是数组的总字节数。

5、联合类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,包括任何垫补在内。

让我们看如下结构:

strUCt{char b; double x;} a;

在某些机器上sizeof(a)=12,而一般sizeof(char)+sizeof(double)=9.

这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。

6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。

四、sizeof与其他操作符的关系

sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。

五、sizeof的主要用途

1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如:

void*malloc(size_t size),

size_tfread(void * ptr,size_t size,size_t nmemb,FILE * stream)。

2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:

void* memset(void * s,int c,sizeof(s))。

六、建议

由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用ziseof来代替常量计算。

The result of the sizeof operator is oftype size_t, an integral type defined in the include file STDDEF.H. Thisoperator allows you to avoid specifying machine-dependent data sizes in yourprograms. The operand to sizeof can beone of the following: A type name. Touse sizeof with a type name, the name must be enclosed in parentheses. An expression. When used with an expression,sizeof can be specified with or without the parentheses. The expression is notevaluated. When the sizeof operator isapplied to an object of type char, it yields 1. When the sizeof operator isapplied to an array, it yields the total number of bytes in that array, not thesize of the pointer represented by the array identifier. To obtain the size ofthe pointer represented by the array identifier, pass it as a parameter to afunction that uses sizeof. For example:

翻译:

sizeof操作符的结果类型为size_t,在include文件STDDEF.H定义整型。这个操作符可以让你避免指定在你的程序依赖于计算机的数据大小。为sizeof的操作数可以是下列之一:A型名称。使用SIZEOF类型名称,名称必须括在括号中。一个表达式。当表达式中使用,SIZEOF可以指定带或不带括号。不计算表达式。 sizeof操作符应用到一个char类型的对象时,它产生1 sizeof操作符应用到一个数组时,它产生该数组的总字节数,而不是指针数组标识符代表的大小。为了获得数组标识符代表指针的大小,通过它作为一个参数传递到一个函数,使用SIZEOF。例如:

Whenthe sizeof operator is applied to a class,struct, or union type, the result is thenumber of bytes in an object of that type, plus any padding added to alignmembers on word boundaries. The result does not necessarily correspond to thesize calculated by adding the storage requirements of the individual members.The /Zp compiler option and the pack pragma affect alignment boundaries for members.

The sizeof operator never yields 0, even for an empty class.

The sizeof operator cannot be used with the following operands:

·Functions. (However, sizeof can beapplied to pointers to functions.)

·Bit fields.

·Undefined classes.

·The type void.

·Dynamically allocated arrays.

·External arrays.

·Incomplete types.

·Parenthesized names of incomplete types.

Whenthe sizeof operator is applied to a reference, theresult is the same as if sizeof had been applied tothe object itself.

If anunsized array is the last element of a structure, the sizeof operatorreturns the size of the structure without the array.

The sizeof operator is often used to calculate the number ofelements in an array using an expression of the form:

sizeof操作符应用到类,结构或联合类型时,其结果是在该类型的对象的字节数,加任何填充添加到字边界对齐的成员。结果不一定符合加入个别成员的存储需求计算的大小。 / ZP编译器选项和包杂影响的成员对齐边界。

sizeof运算符不会产生0,甚至为一个空类。

sizeof操作符不能使用以下操作数:

函数。(然而,SIZEOF可以应用到函数的指针。)

位字段。

未定义类。

void类型。

动态分配数组。

外部数组。

不完全类型。

括号不完全类型的名称。

sizeof操作符应用到引用,其结果是相同的,如果sizeof已应用于对象本身。

如果一个可变大小的数组是结构体的最后一个元素,sizeof操作符返回没有数组的结构体的大小。

简单的例子

//在vs2010开发环境下 ,Win764位系统
//在vs2010开发环境下 ,Win764位系统
#include <stdio.h>
 
void main()
{
    int i=0;
    int *p = NULL;
    int a[100];
    int b[100];
    int iB,iC,iD,iE,iF,iG;
    void fun(int b[100]);
 
    //size_t            //typedef_W64 unsigned int   size_t;
    sizeof(int);        //OK 数据类型要加括号  值为4
    sizeof(i);          //OK 数据对象可加可不加括号  值为4
    //sizeof int;       //error数据类型一定要加括号
    sizeof i;           //OK 数据对象可加可不加括号  值为4
    iB=sizeof(p);       //OK 指针类型的对象  值为4
    //sizeof(int)*p;    //error数据类型一定要加括号,因为(int)*p是表达式,
                        //而sizeof是不计算表式的,而是通过表达式的最后类型来计算大小的
    iB=sizeof((int)*p); //OK   值为4
    iC=sizeof *p;       //OK   指针变量的值一般为4
    iD=sizeof (a);      //OK   数组类型的的值为4数组的长度 400
    iE=sizeof(a[100]); //请尤其注意本例。 Ok  值为4
    iF=sizeof(&a);      //OK 指针的指针类型(指针类型)的对象  值为4
    iG=sizeof(&a[0]);   //OK 指针类型的对象  值为4
    fun(b);
}
 
void fun(int b[100])  //数组传参,传进来的是数组元素类型的指针
{
    int i_A=sizeof(b);// sizeof (b) 的值是多少? 4
}


分享到:
评论

相关推荐

    详细解析C语言中的sizeof

    详细解析C语言中的sizeof详细解析

    解析C语言中的sizeof.rar

    析Sizeof的用途

    解析C语言中的sizeof.docx

    解析C语言中的sizeof.docx

    解析C语言中的sizeof.pdf

    。。。

    详细解析C语言中的sizeof.pdf

    。。。

    详细解析C语言中的sizeof.docx

    。。。

    基于lex&yacc技术的C语言头文件的解析器(c head file parser)

    这里是我所实现的程序的一个最关键部件:C语言头文件解析器。 其中比较关键的就是字节对齐的部分。 一个sizeof我写了很久。C语言的复杂真是可想而知。 而我只写了一个还不是非常完善的头文件解析器。 希望能对其它...

    详细解析C语言中的sizeof (2).pdf

    。。。

    详细解析C语言中的sizeof (2).docx

    。。。

    解析C语言中的sizeof

    一、sizeof的概念 ;二、sizeof的使用方法 ;三、sizeof的结果 ;四、sizeof与其他操作符的关系 ;五、sizeof的主要用途 ;六、建议 。

    C语言中sizeof()与strlen()函数的使用入门及对比

     sizeof其实就是用于告诉我们编译器在为某一特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间大小,以字节为单位。 3,怎么用?  sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    3.8 sizeof操作符 3.9 使用getchar()和putchar() 3.10 数学函数 3.10.1 使用abs()和fabs() 3.10.2 unix和数学函数库 3.11 隐式类型转换和强制类型转换 3.11.1 整型提升 3.11.2 寻常算术转换 3.11.3 强制类型...

    详细说明使用C语言解析BMP图片

    BMP 最后是按行组织的图像数据,但这些数据并不是简单的按照图像的高度宽度w*h的数组...图像的实际数据之前的偏移量是:sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)=14+40+1024=1078个字节

    C语言进阶 作者 Wrestle.Wu

     与strlen、sizeof、const、volatile、void、void*、#define、typedef、realloc、malloc、calloc等相关的一些陷阱知识点的解析;  时间复杂度、冒泡排序法、选择排序法、快速排序法、归并排序法、顺序排序法、...

    C语言进阶-牟海军.pdf

     与strlen、sizeof、const、volatile、void、void*、#define、typedef、realloc、malloc、calloc等相关的一些陷阱知识点的解析;  时间复杂度、冒泡排序法、选择排序法、快速排序法、归并排序法、顺序排序法、二...

    C++ sizeof 实例解析

    sizeof是C语言的一种单目操作符,如C语言的其他操作符++、–等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。sizeof使用形式有三种:sizeof(var_name)或sizeof var_name或sizeof(var_type)。...

    读取或解析图片的exif信息

    通过导入一张图片,调用封装好的函数尽心解析图片的信息,可以提取里面全部信息,例如经纬度,时间,相机的信息,光照,高度,等等,你需要按照一下步骤进行了 Cexif exif; // EXIFINFO pexif=(EXIFINFO *)malloc...

    《你必须知道的495个C语言问题》

    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...

    你必须知道的495个C语言问题

    1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 声明问题 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 *1.26 main的正确定义是什么...

Global site tag (gtag.js) - Google Analytics