C语言关键字 sizeof 是一个操作符,返回对象或类型所占内存字节数,类型为size_t(定义在<stddef.h>),有2种用法:

  • sizeof unary-expression
  • sizeof (type-name)

sizeof不能应用的场合:

  • an expression that has function type or an incomplete type
  • the parenthesized name of such a type
  • an expression that designates a bit-field member

如果操作数的类型是VLA (variable length array),要进行evaluate;否则不需要evaluate,结果是一个整形常量。

示例1 进程间通信 比如storage allocator 和 I/O system

extern void *alloc(size_t);
double *dp = alloc(sizeof *dp);

示例2 计算数组中元素个数

sizeof array / sizeof array[]

示例3 VLA大小计算

#include <stddef.h>
size_t fsize3(int n)
{
  char b[n+]; // variable length array
  return sizeof b; // execution time sizeof
}
int main()
{
  size_t size;
  size = fsize3(); // fsize3 returns 13
  return ;
}

ANSI C规定字符型1字节,其余sizeof的返回结果与编译器实现相关。在32位系统中:

1. 基本类型

_Bool 1

char 1

short 2

int 4

long 4

long long 8

float 4

double 8

long double 12

_Complex 16

void 1

2. 指针

4

3. 枚举

4

4. 数组

数组长度 * 数组成员size

5. 结构体

字节对齐值:ALIGN
基本类型成员:SIZE

每个成员相对于结构体首地址的偏移都是min(ALIGN, SIZE)的整数倍,可能在成员间加填充字节
结构体总大小为min(ALIGN, SIZEmax)的整数倍,可能在最后一个成员后加填充字节

6. 联合

规则类似struct

测试程序:

#include <stdio.h>
#include <complex.h> #define SIZEOF(x) printf("size of '%s' is %zd\n", #x, sizeof(x)); int main() {
SIZEOF(_Bool);
SIZEOF(char);
SIZEOF(short);
SIZEOF(int);
SIZEOF(long);
SIZEOF(long long);
SIZEOF(float);
SIZEOF(double);
SIZEOF(long double); // depends on -m128bit-long-double
SIZEOF(_Complex);
SIZEOF(void); SIZEOF(void*);
SIZEOF(void (*)(void)); // function pointer SIZEOF(enum {E}); SIZEOF(char []); // zero-size array
SIZEOF(int []); SIZEOF(struct {}); // empty struct
SIZEOF(struct {char c;});
SIZEOF(struct {char c; short s;}); // alignment
SIZEOF(struct {int i; char c;});
SIZEOF(struct {int i; char c;} __attribute__((packed)));
#pragma pack(push)
#pragma pack(1)
printf("With #pragma pack(1): ");
SIZEOF(struct {int i; char c;});
#pragma pack(pop)
SIZEOF(struct {double d; char c;}); // depends on -malign-double SIZEOF(struct {char c1:; char :; char c2:;}); // bit field
SIZEOF(struct {int i:; char c:;}); SIZEOF(struct {struct {int i; char c;}; short s;});
SIZEOF(struct {struct {short s1; char c;}; short s2;});
SIZEOF(struct {char c2; struct {short s1; char c1;}; short s2;}); SIZEOF(union {char c; int i;}); // union
return ;
}

C语言关键字之sizeof的更多相关文章

  1. C语言关键字—-sizeof 、typedef、const、static、register、extern、#define

    关键字:sizeof .#define.typedef.const.static.register.extern sizeof 1. 作用:求数据所占得内存空间大小 2. 本质:求数据得类型所占的内存 ...

  2. FILE不是C语言关键字

    FILE不是C语言关键字,只是标准C中的标准输入输出中定义的一个新的数据类型 stdio.htypedef struct _iobuf{ char* _ptr; int _cnt; char* _ba ...

  3. 李洪强漫谈iOS开发[C语言-009] - C语言关键字

    // //  main.m //  04 - C语言关键字 // //  Created by vic fan on 16/7/12. //  Copyright © 2016年 李洪强. All r ...

  4. c语言关键字总结

    1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _Imaginary(注意bool 从 ...

  5. 1.C语言关键字(auto break case char const swtich)

    ANSI C标准C语言共有32个关键字,分别为: auto break case char const continue default do double else enum extern floa ...

  6. C/C++ 知识点---C语言关键字(32个)

    C/C++ 知识点 1.C语言关键字(32个) <1>.基本数据类型 [5] void :声明函数无返回值或无参数,声明空类型指针 char :声明字符型变量 int :声明整形变量 fl ...

  7. 继续学习:C语言关键字

    auto :声明自动变量 break:跳出当前循环 case:开关语句分支 char :声明字符型变量或函数 const :声明只读变量 continue:结束当前循环,开始下一轮循环 default ...

  8. 统计C语言关键字出现次数

    统计C语言关键字出现次数 <C程序设计语言>K&R版本第6章结构6.3结构数组内容 /* Name: 统计c语言关键字出现次数 Copyright: Author: lingr7 ...

  9. C语言关键字-volatile

    1.C语言关键字volatile     C 语言关键字volatile(注意它是用来修饰变量而不是上面介绍的__volatile__)表明某个变量的值可能在外部被改变,因此对这些变量的存取 不能缓存 ...

随机推荐

  1. maven使用nexus3.3在windows下搭建私服

    1. 私服简介 私服是指私有服务器,是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构建.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则 ...

  2. 数据库中间件MyCat学习总结(1)——MyCat入门简介

    为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代.如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷. MyCat的目标就是:低成本 ...

  3. 所有在Linux系统下 arp -d $ip 命令只能清除一个IP地址的对应MAC地址缓存,可以使用组合命令操作。

    https://blog.csdn.net/u011641885/article/details/48175239 https://blog.csdn.net/zj0910/article/detai ...

  4. Stealing Harry Potter's Precious BFS+DFS

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  5. codevs——1675 大质数 2

    1675 大质数 2  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 小明因为没做作业而被数学老师罚站,之 ...

  6. 《Linux内核分析》MOOC课程

    http://www.cnblogs.com/wickedpriest/p/4315189.html

  7. 导出excel——弹出框

    表单提交 凡是表单提交(表单提交分3种,见以下的1.2.3)的话.而且设置了表单标签的enctype="multipart/form-data"属性.那么这个时候就会打开弹出框. ...

  8. SQL经典面试题集锦

    1.问题背景 (1)学生表(学号,姓名,年龄,性别) student(S#,Sname,Sage,Ssex) (2)课程表(课程编号,课程名称,教师编号) course(C#,Cname,T#) (3 ...

  9. 【MVC框架】——View和Controller之间的传值

    在MVC中,Controller运行一个能够说是路由功能.它通过View传过来的数据,来决定应该调用哪一个Model,相同会把Model处理完的数据传给View,所以就总是涉及到Controller和 ...

  10. 在Linux上配置DRBD部署

    drbd 工作原理DRBD是一种块设备,能够被用于高可用(HA)之中.它相似于一个网络RAID-1功能.当你将数据写入本地 文件系统时,数据还将会被发送到网络中还有一台主机上.以同样的形式记录在一个文 ...