C语言关键字之sizeof
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的更多相关文章
- C语言关键字—-sizeof 、typedef、const、static、register、extern、#define
关键字:sizeof .#define.typedef.const.static.register.extern sizeof 1. 作用:求数据所占得内存空间大小 2. 本质:求数据得类型所占的内存 ...
- FILE不是C语言关键字
FILE不是C语言关键字,只是标准C中的标准输入输出中定义的一个新的数据类型 stdio.htypedef struct _iobuf{ char* _ptr; int _cnt; char* _ba ...
- 李洪强漫谈iOS开发[C语言-009] - C语言关键字
// // main.m // 04 - C语言关键字 // // Created by vic fan on 16/7/12. // Copyright © 2016年 李洪强. All r ...
- c语言关键字总结
1.关键字变更历史 1999年12月16日,ISO推出了C99标准,该标准新增了5个C语言关键字: inline restrict _Bool _Complex _Imaginary(注意bool 从 ...
- 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 ...
- C/C++ 知识点---C语言关键字(32个)
C/C++ 知识点 1.C语言关键字(32个) <1>.基本数据类型 [5] void :声明函数无返回值或无参数,声明空类型指针 char :声明字符型变量 int :声明整形变量 fl ...
- 继续学习:C语言关键字
auto :声明自动变量 break:跳出当前循环 case:开关语句分支 char :声明字符型变量或函数 const :声明只读变量 continue:结束当前循环,开始下一轮循环 default ...
- 统计C语言关键字出现次数
统计C语言关键字出现次数 <C程序设计语言>K&R版本第6章结构6.3结构数组内容 /* Name: 统计c语言关键字出现次数 Copyright: Author: lingr7 ...
- C语言关键字-volatile
1.C语言关键字volatile C 语言关键字volatile(注意它是用来修饰变量而不是上面介绍的__volatile__)表明某个变量的值可能在外部被改变,因此对这些变量的存取 不能缓存 ...
随机推荐
- mysql 5.5与5.6 timestamp 字段 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的区别
http://www.111cn.net/database/mysql/55392.htm 本文章来给各位同学介绍关于mysql 5.5与5.6 timestamp 字段 DEFAULT CURREN ...
- hdu 1533KM算法
#include<stdio.h> #include<string.h> #include<math.h> #define inf 0x3fffffff #defi ...
- scrapy的User-Agent中间件、代理IP中间件、cookies设置、多个爬虫自定义settings设置
在scrapy的反爬中,常用的几个配置,简单总结了下: User-Agent中间件: from fake_useragent import UserAgent class RandomUserAgen ...
- vue.js组件之间通讯的数据双向绑定----父亲把数据传递给儿子,儿子更改数据后,重新发送给父亲,父亲数据更改后,属性会重新发送个儿子,儿子刷新新数据
vue组件是相互独立的,如果要交互通讯,这时候,就需要组件之间数据互通了 往常我们讲的都是数据传递,子传父,父传子,都没有说子和父,父与子之间的数据互通 父亲传递给儿子数据,儿子触发一个父亲方法,将最 ...
- JVM即时编译(JIT)
Java解释执行过程: 代码装入-代码校验-代码执行 Java字节码的执行方式分为两种:即使编译方式和解释执行方式.即时编译是值解释器先将字节码编译成机器码,然后执行该机器码.解释执行的方式是指解释器 ...
- IBOutlet loadView UIButton的subview数量 UIWebView
IBOutlet声明的插座变量和属性一起使用的时候,在.m文件调用的是属性. 在loadView方法中获取view属性会产生循环引用问题并导致内存溢出. Control+E到行尾,Control+A到 ...
- Ubuntu 16.04安装汇编编译器NASM
NASM支持intel语法. 安装过程: 1.通过二进制包方式 下载: http://www.nasm.us/pub/nasm/releasebuilds/2.13/ 如果要下载其它版本可以把地址靠前 ...
- ADO连接ACCESS2007及以上版本的数据库
function getaccessstr(databasename:string;password:string;accessVer:string='access2003'):string; beg ...
- Win7 如何卸载IE9
1 控制面板,卸载程序 2 查看已安装的更新 3 右击对应更新,选择卸载.
- Java中的equals()和hashCode()
概述 在我们使用类集框架(比方使用hashMap.hashSet)的时候,常常会涉及到重写equals()和hashCode()这两个方法. 这两个方法的联系是: 1. 假设两个对象不同,那么他们的h ...