sizeof什么意思:C语言求字节数
sizeof什么意思,它是C、C++语言内置运算符,作用是计算数据类型、变量在当前运行环境下占用的内存字节数量,不是函数,不需要引入头文件,返回值类型是size_t,你在32位编译环境和64位编译环境拿到的结果会不一样,只编译不运行就能算出静态分配内存大小,动态申请的堆内存无法通过它获取总长度。
sizeof基础语法与写法
它有两种常用书写形式,第一种是sizeof(类型名),比如sizeof(int),用来直接查询这个基础类型占多少字节;第二种是sizeof(变量名)或者sizeof变量名,不带括号的写法仅支持变量,不能直接写类型。写括号的时候,括号里面不会执行表达式,sizeof(a++)不会改变a的值,编译器只会判断里面最终对应的类型,不会运行里面的运算逻辑。
分清运算符和函数。
sizeof对数组、指针的计算规则
数组名传给sizeof时,只要数组没有发生隐式转指针,返回的就是整个数组占用的总字节,chararr[10],sizeof(arr)得到10;但数组作为函数形参传入时,数组会退化成指针,此时sizeof拿到的是指针本身的字节数,64位环境下指针固定占8字节。二级指针、字符指针都遵循这条规则,指针存储的是地址,sizeof只关心地址变量本身的大小,不关心它指向的内容有多长。
| 计算对象 | 64位环境结果 | 说明 |
|---|---|---|
| sizeof(int) | 4 | 整型基础类型 |
| char数组数组名 | 数组长度 | 未退化时计算全部空间 |
| char指针 | 8 | 只算地址变量大小 |
sizeof结构体计算的对齐规则
结构体参与sizeof计算会用到内存对齐,编译器会按照成员里最大基础类型的字节宽度补齐空位,不是简单把所有成员字节相加。结构体内部可以用预处理指令修改对齐参数,修改对齐后sizeof的返回值会同步变化,这部分规则在不同编译器上存在细微差异,GCC和MSVC的默认对齐策略不完全一致。
你写跨平台代码时,不能硬编码字节数值,优先用sizeof获取长度,避免不同编译平台出现数据错位。
sizeof的适用边界
它不能用来求malloc申请出来的堆内存大小,堆内存的长度信息保存在内存管理器内部,标准C语言没有接口可以直接用sizeof读取。位域成员也不能单独用sizeof计算,sizeof只能拿到整个包含位域的结构体整体大小,无法单独提取某一个位域占用比特数。
返回值size_t是无符号整数类型,做减法比较的时候要留意,无符号数负数会变成很大的正数,容易引发逻辑判断出错。
循环遍历数组时,配合sizeof可以自动算出元素个数,计算公式为sizeof(数组)/sizeof(数组首元素类型),这个写法只对原始数组有效,对已经退化成指针的参数不生效。
