C语言 sizeof

定义

sizeof是C语言的一种单目操作符。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。

使用方法

用于数据类型

sizeof(type) 数据类型必须用括号括住

用于变量

sizeof var_name 变量名可以不用括号括住,但是,一般习惯于用括号括住

注意

sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。sizeof(void)都不是正确形式。

字节长度

数据类型所占用字节数与机器字长与编译器有关,遵循的几条规律如下:

  • sizeof(short int )<=sizeof(int)
  • sizeof(int)<=sizeof(long int)
  • short int 至少应为16位(2个字节)
  • long in 至少应为32位(4个字节)

常见字长

  • 16位编译器:char *(指针变量):2个字节(寻址空间为216,所以为两个字节)
  • 32位编译器:char *(指针变量):4个字节
  • 64位编译器:char *(指针变量):8个字节

常见结果

数组

数组所占的内存字节数,包括空字符'\0'

int a[3]; sizeof(a)=3*4=12

char a1[] = "abc"; sizeof(a1)=4,包括空字符

结构体

结构体的字节数由于考虑到字节对齐,因此不仅仅是结构体内部数据的字节数之和这么简单。

字节对齐的细节和编译器实现相关,但一般而言,满足三个准则:

1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal padding);

3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。

#include<stdio.h>

struct A {

int a; //art 0 end 3

double b[100]; //original starting position 4 aligned starting position 8 end 101*8-1

char c[3]; //original starting position 101*8 end 101*8+2

_Bool v; //original starting position 101*8+3 end 101*8+3+1/8

//final action align the length of struct,so that 填充字节,使其成为最宽基本类型成员大小的整数倍

}a;

int main() {

struct A a1;

printf("%d\n", sizeof a1);

while (getchar() != '\n');

getchar();

return 0;

}

运行结果:816(102*8)

指针

指针是来存放地址的,那么它当然等于计算机内部地址总线的宽度。在32位计算机中,一个指针变量的返回值必定是4个字节。指针变量的sizeof值与指针所指的对象没有任何关系。

联合体

结构体在内存组织上市顺序式的,联合体则是重叠式,各成员共享一段内存;所以整个联合体的sizeof也就是每个成员sizeof的最大值。

函数

sizeof也可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。

对函数求值的形式

sizeof(函数名(实参表))

注意

1)不可以对返回值类型为空的函数求值。

2)不可以对函数名求值。

3)对有参数的函数,在用sizeof时,须写上实参表。

相关推荐
奔跑吧邓邓子1 小时前
【C语言实战(65)】C语言实战:筑牢防线,攻克缓冲区溢出难题
c语言·开发实战·缓冲区溢出·缓冲区溢出防护
杨福瑞1 小时前
数据结构:单链表(1)
c语言·开发语言·数据结构
Yupureki1 小时前
从零开始的C++学习生活 17:异常和智能指针
c语言·数据结构·c++·学习·visual studio
deng-c-f9 小时前
配置(4):VScode c/c++编译环境的配置:c_cpp_properties.json
c语言·c++·vscode
散峰而望13 小时前
基本魔法语言数组 (一) (C语言)
c语言·开发语言·编辑器·github·visual studio code·visual studio
Fr2ed0m15 小时前
卡尔曼滤波算法原理详解:核心公式、C 语言代码实现及电机控制 / 目标追踪应用
c语言·人工智能·算法
Yupureki15 小时前
从零开始的C++学习生活 20:数据结构与STL复习课(4.4w字全解析)
c语言·数据结构·c++·学习·visual studio·1024程序员节
一念&15 小时前
每日一个C语言知识:C 错误处理
c语言·开发语言·算法
奔跑吧邓邓子16 小时前
【C语言实战(66)】筑牢防线:C语言安全编码之输入与错误处理
c语言·安全·开发实战·错误处理·输入验证
雨落在了我的手上16 小时前
C语言入门(十三):操作符详解(1)
c语言