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

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.rar

    在C语言中,`sizeof`是一个非常重要的运算符,它用于获取任何数据类型或变量所占用的内存字节数。这个运算符对于理解和优化代码、处理内存分配以及了解底层计算机工作原理都至关重要。下面我们将详细探讨`sizeof`的...

    详细解析C语言中的sizeof

    ### 详细解析C语言中的`sizeof` #### 一、`sizeof`的概念 `sizeof`是C语言中的一个单目操作符,类似于其他操作符如`++`和`--`等。需要注意的是,`sizeof`不是函数,而是用来获取操作数(可以是一个表达式或类型名...

    解析C语言中的sizeof.docx

    C语言中的sizeof操作符 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的...

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

    在C语言中,`sizeof`是一个非常重要的操作符,它用于获取任何数据类型或变量在内存中占用的字节数。下面将详细解释`sizeof`的各个方面。 首先,`sizeof`是一个操作符而不是一个函数,这意味着它在编译时就被计算,...

    解析C语言中的sizeof.pdf

    在C语言中,`sizeof`是一个非常重要的操作符,它用于获取任何数据类型或变量在内存中占用的字节数。下面将详细解释`sizeof`的各个方面。 首先,`sizeof`是一个操作符,而非函数,它能够返回一个表达式或类型所占的...

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

    C 语言中的 sizeof 操作符详解 sizeof 操作符是 C 语言中的单目操作符,它以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。sizeof 操作符的结果类型是 size_t,它在头文件中 ...

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

    C 语言中的 sizeof 操作符 sizeof 操作符是 C 语言的一种单目操作符,它可以用来获取变量或数据类型的存储大小。sizeof 操作符的结果类型是 size_t,它在头文件中 typedef 为 unsigned int 类型。 一、sizeof 的...

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

    C 语言中的 sizeof 操作符 在 C 语言中,sizeof 是一种单目操作符,用于获取操作数的存储大小。它可以用于数据类型、变量、数组、结构体、联合体和指针等多种类型的操作数。 sizeof 的概念 sizeof 操作符以字节...

    C语言中的sizeof使用方法.docx

    在C语言中,`sizeof`是一个非常重要的操作符,它用于获取数据类型或者变量在内存中占用的字节数。这个操作符对于理解和优化代码的内存使用是至关重要的。下面将详细解释`sizeof`的各个方面。 首先,`sizeof`是一个...

    解析C语言中的sizeof

    C语言中的sizeof操作符 在C语言中,sizeof是一个单目操作符,它可以用来计算变量或类型的存储大小。本文将详细介绍sizeof的概念、使用方法、结果、与其他操作符的关系、主要用途和建议。 一、sizeof的概念 sizeof...

    基于C语言的MiniCSV解析库示例:csv文件解析

    在C语言中解析CSV文件,我们需要理解文件的基本操作,如打开、读取和关闭文件,以及如何处理逗号分隔的字符串。 首先,我们需要了解C语言中的文件操作。`fopen()`函数用于打开文件,`fclose()`用于关闭文件,而`...

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

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

    c语言试题及解析,详细易懂

    - C语言中,函数参数的传递是单向值传递,即实参的值被复制给形参,形参的改变不会影响实参的值。这意味着调用结束后,实参变量的值保持不变。 3. **字符串操作**: - `strcpy()`函数用于将一个字符串复制到另一...

    nmea-0183协议解析C语言链表实现

    在C语言中,通过链表实现对NMEA-0183协议的解析是一种常见且高效的方法,尤其是在处理大量连续到来的数据时。 首先,我们需要理解NMEA-0183协议的基本结构。每个NMEA语句都以"$"开头,以"*"和校验和结尾,中间是...

    C语言指针详细解析

    在C语言中,数组名实际上是一个指向数组第一个元素的常量指针。这意味着你可以像操作指针一样操作数组名。例如,在例二中,`int *ptr = a;` 将`ptr`初始化为指向数组`a`的第一个元素,即使`a`是一个字符数组。这是...

    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语言中关键字的解析

    以下是对C语言中32个关键字的详细解释: 1. `auto`:这个关键字用来声明自动变量,通常在函数内部使用,变量的生命周期仅限于该函数。但在现代C编程中,`auto`很少被显式使用,因为这是默认的存储类别。 2. `...

Global site tag (gtag.js) - Google Analytics