zoukankan      html  css  js  c++  java
  • 转]解析C语言中的sizeof

    解析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定义为int max(),sizeof(char_v) 若此时char_v定义为char char_v [MAX]且MAX未知, 
    sizeof(void)都不是正确形式。 


    三、sizeof的结果 

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

      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。 

      3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/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_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。 

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

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


    六、建议 

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

  • 相关阅读:
    NTP on FreeBSD 12.1
    Set proxy server on FreeBSD 12.1
    win32 disk imager使用后u盘容量恢复
    How to install Google Chrome Browser on Kali Linux
    Set NTP Service and timezone on Kali Linux
    Set static IP address and DNS on FreeBSD
    github博客标题显示不了可能是标题包含 特殊符号比如 : (冒号)
    server certificate verification failed. CAfile: none CRLfile: none
    删除文件和目录(彻底的)
    如何在Curl中使用Socks5代理
  • 原文地址:https://www.cnblogs.com/lanye/p/5391649.html
Copyright © 2011-2022 走看看