c语言详解sizeof

 

原文地址:http://blog.sina.com.cn/s/blog_5da08c340100bmwu.html

一、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的结果(以下结果都是在Linux v2.6 gcc v4获取)

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

  1、ANSI C正式规定字符类型为1字节。    
    sizeof(char)          = 1;
    sizeof(unsigned char) = 1;
    sizeof(signed char)   = 1;
  
  2、其他类型在ANSI C中没有具体规定,大小依赖于实现。
    
    sizeof(int)            = 4;
    sizeof(unsigned int)   = 4;
    sizeof(short int)      = 2;
    sizeof(unsigned short) = 2;
    sizeof(long int)       = 4;
    sizeof(unsigned long)  = 4;
    sizeof(float)          = 4;
    sizeof(double)         = 8;
    sizeof(long double)    = 12;

  3、当操作数是指针时,sizeof依赖于编译器。
   
    Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。
    一般Unix/Linux的指针字节数为4。    
    例如: char *p;      //Linux中
          sizeof(p) = 4;

  4、当操作数具有数组类型时,其结果是数组的总字节数。
 
    例如: char a[5];
          int  b[5];
          sizeof(a) = 5;
          sizeof(b) = 20;
   
    5、当操作数是具体的字符串或者数值时,会根据具体的类型进行相应转化。
 
    例如: sizeof(8)    = 4;  //自动转化为int类型
          sizeof(8.8)  = 8;  //自动转化为double类型,注意,不是float类型
          sizeof("ab") = 3   //自动转化为数组类型,
                             //长度是4,不是3,因为加上了最后的'\n'符
                             //有资料说,会自动转化为指针类型(Linux为4)
                             //可能和操作系统与编译器有关系
         
  6、当操作数是联合类型时,sizeof是其最大字节成员的字节数。
       当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。    
    
    还是让我们拿例子来说话:
    union  u{             //对union来说
          char c;
          double d;
    }u;
    sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

  struct a{             //对struct来说
          char b; 
          double x;
    }a;   
  在Linux上: sizeof(a) = 12;
    而一般sizeof(char) + sizeof(double) = 9; 
  这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
    但如果全对齐的话,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;
    在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节,
    达到8个,这时候偏移量为8,放上x后长度为16。
    在此例中,所有的结构成员都要放在被4整除的地址(Linux的存放方式),这里补3个字节,所以为12。

  7、当操作数是函数中的数组形参或函数类型的形参:
   
    sizeof给出其指针的大小,Linux中值为4。

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

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

五、sizeof的主要用途  

  1、主要用途是与存储分配和I/O系统那样的例程进行通信。
 
    例如: void *malloc(size_t size);
        size_t fread(void *ptr, size_t size, size_t nmemb, FILE * stream);    

  2、另一个的主要用途是计算数组中元素的个数。
 
    例如: void *memset(void *s, int c, sizeof(s)); 

c++ sizeof详解的更多相关文章

  1. c strlen和sizeof详解

    用双引号定义并且声明的时候明确指定数组大小的话,sizeof就会返回指定的大小,不会自动加1: char str2[10] = "hello c"; printf("st ...

  2. (转载) Linux IO模式及 select、poll、epoll详解

    注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...

  3. malloc 与 free函数详解<转载>

    malloc和free函数详解   本文介绍malloc和free函数的内容. 在C中,对内存的管理是相当重要.下面开始介绍这两个函数: 一.malloc()和free()的基本概念以及基本用法: 1 ...

  4. sk_buff封装和解封装网络数据包的过程详解

    转自:http://www.2cto.com/os/201502/376226.html 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  5. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

  6. Linux C 字符串输入函数 gets()、fgets()、scanf() 详解

    一.gets() 函数详解 gets()函数用来从 标准输入设备(键盘)读取字符串直到 回车结束,但回车符('\n')不属于这个字符串. 调用格式为: gets(str); 其中str为字符串变量(字 ...

  7. Linux C 字符串函数 sprintf()、snprintf() 详解

    一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...

  8. Linux C popen()函数详解

    表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...

  9. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  10. memset函数详解

    语言中memset函数详解(2011-11-16 21:11:02)转载▼标签: 杂谈 分类: 工具相关  功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大 ...

随机推荐

  1. 数据结构——八大排序算法(java部分实现)

    java基本排序算法 1.冒泡排序 顶顶基础的排序算法之一,每次排序通过两两比较选出最小值(之后每个算法都以从小到大排序举例)图片取自:[小不点的博客](Java的几种常见排序算法 - 小不点丶 - ...

  2. PWA-H5 Web App优化探索之路(Service Worker,Lighthouse)

    PWA是什么? Progressive Web App 渐进式web应用程序,简单来说,就是可以让你的WEB App,带来与原生App相媲美的用户体验.. 为什么要用PWA? 简单来说,是为了web应 ...

  3. Flutter新版本2.X系列--01创建项目

    1.新建项目,打开Android studio,点击红圈部分 2.选择第一个 3.设置你的项目名称,flutter sdk位置,以及项目存储路径 4.设置包名,这个要唯一 5.好啦 ~ 作为一名前端开 ...

  4. Angular基础之ngFor遍历对象数组获取key和value渲染页面的几种方法

    Angular的ngFor遍历对象数组的几种方法 方法一 ts文件: export class MyDemo {   objectKeys = Object.keys;   myObj = { a: ...

  5. Java基础1-1-1—java基础语法(数据类型及转换)

    JAVA基础 1.数据类型及转换 1.1 注释 注释是在程序指定位置添加的说明性信息 简单理解:对代码的一种解释说明,方便我们程序员更好的去阅读代码 // 单行注释 /* 多行注释 */ /**文档注 ...

  6. 容器镜像仓库-Harbor的安装及踩坑

    之前实验室的师兄让我帮忙给服务器上装一个Harbor,花了不少时间,遂记录之,以避坑. 在学习使用Harbor之前,需要了解Docker的使用,可以看看我之前的博客:应用容器引擎-Docker.Doc ...

  7. 记一次 .NET 某游戏网站 CPU爆高分析

    一:背景 1. 讲故事 这段时间经常有朋友微信上问我这个真实案例分析连载怎么不往下续了,关注我的朋友应该知道,我近二个月在研究 SQLSERVER,也写了十多篇文章,为什么要研究这东西呢? 是因为在 ...

  8. Vue的认识、入门小历史

    VUE.3 小知识 渐进式框架,尤雨溪 Soc原则:关注度分离原则 网络通信:axios 页面跳转:vue-router 状态管理:vuex Vue-ui: Ant-Design 阿里巴巴基于Reac ...

  9. 微信小程序使用vant组件样式不生效的问题

    下面提供几个解决方案 方案一: 官方文档有说明,将 app.json 中的 "style": "v2" 去除,小程序的新版基础组件强行加上了许多样式,难以覆盖, ...

  10. 【TS】联合类型--类型断言--类型推断

    联合类型 在实际开发中,我们接收的变量可能不是一个固定的数据类型,而是动态的多个数据类型,此时用单个固定的数据类型去接收很明显是不行的,为了解决这种可能会接收多个不同数据类型的变量就需要用到联合类型. ...