C语言 sizeof

news2024/11/24 13:04:11

定义

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时,须写上实参表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1093683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#,数值计算——数据建模Proposal的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Proposal { public Normaldev gau { get; set; } null; private double logstep { get; set; } public Proposal(int ranseed, double lstep) { this.gau…

OpenRemote: Java 开源 IoT 物联网开发平台,匹配智慧城市、智能家居、能源管理

OpenRemote 是一个直观、用户友好的基于Java语言的开源 IoT 物联网设备管理平台&#xff0c;它包括从连接设备到构建应用程序和特定领域的智能应用程序的所有功能和特性。通过OpenRemote物联网平台&#xff0c;用户可以收集和处理来自不同设备的传感器数据&#xff0c;适用于智…

办理400电话客服中心的申请步骤及注意事项

引言&#xff1a; 在现代商业环境中&#xff0c;提供优质的客户服务是企业成功的关键之一。而办理400电话客服中心可以帮助企业建立一个高效、专业的客户服务团队&#xff0c;提升客户满意度和忠诚度。本文将介绍办理400电话客服中心的申请步骤及注意事项&#xff0c;帮助企业顺…

java: 无效的目标发行版: 11

第一步&#xff1a; 第二步&#xff1a; 第三步

BGP初解笔记

BGP&#xff08;公网用得多&#xff09;&#xff1a; 一、名词&#xff1a; 1、BGP speaker&#xff1a;启用了BGP进程的路由器 2、BGP对等体&#xff1a;双方建立BGP邻居关系的设备&#xff1a; a.IBGP对等体&#xff0c;AS号一致&#xff0c;为IBGP对等体&#xff0c;有水…

如何做好商品的库存管理?哪些指标是衡量库存的指标

如何做好商品的库存管理&#xff1f;哪些指标是衡量库存的指标&#xff1f;库存分析的方法繁杂且广泛&#xff0c;选择正确的方法才能更好的进行库存分析。 本文将为大家盘点一些常用的库存分析方法和监控指标&#xff0c;全程干货&#xff0c;建议收藏&#xff01; 01 如何进…

网络编程中的重难点:套接字的应用和理解

什么是网络编程 网络编程&#xff0c;指的是网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或成为网络数据传输&#xff09;。 发送端和接收端 在一次网络数据传输时&#xff1a; 发送端&#xff1a;数据的发送方进程&#xff0…

GD32F103 ADC

1. 模拟量于数字量。 模拟量&#xff1a;反应真实世界中的物理量&#xff08;比如温度&#xff0c;压力&#xff0c;长度&#xff09;模拟量通常是通过电压&#xff0c;电流等信号来表示。 数字量&#xff1a;通常是0和1来表示某个物理量的变化。 2. ADC&#xff08;模拟量转…

通过HTTP发送大量数据的三种方法

在网络的早期时期&#xff0c;人们发送的文件大小仅为几KB。到了2023年&#xff0c;我们享受着高分辨率的MB级别图像&#xff0c;并在几GB的4K&#xff08;即将是8K&#xff09;视频中观看。 即使有良好的互联网连接&#xff0c;下载一个5GB的文件仍然需要一些时间。如果你拥有…

Photoshop 2024正式发布!内置最新PS AI,创意填充等功能无限制使用!

PS正式版目前更新到了2024&#xff0c;版本为25.0。 安装教程 1、下载得到安装包后&#xff0c;先解压。鼠标右键&#xff0c;【解压到当前文件夹】 2、双击 Set-up 开始安装 3、这里可以更改安装位置。如果C盘空间不够大&#xff0c;可以把它安装到C盘以外。更改好后&#x…

SpringBoot面试题3:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? Spring Boot 的核心注解是 @SpringBootApplication。 @SpringBootApplication 是一…

【idea】 java: 找不到符号

idea 启动时提示 java: 找不到符号 java: 找不到符号 符号: 方法 getCompanyDisputeCount() 位置: 类型为com.yang.entity.AreaAnalyse的变量 areaAnalyse 在setting ——> Compiler ——>Shared build process VM options: 添加&#xff1a; -Djps.track.ap.dep…

Vue3<script setup>语法糖下,实现父子组件通信以及数据监听的三种方法。

在Vue3的script setup语法糖中&#xff0c;没有办法通过Vue2的ref、props、parent、中央时间总线等等众多方法&#xff0c;通过this指针简单的实现父子组件的通信&#xff0c;网络上也很少有关于script setup语法糖的相关教程&#xff0c;所以决定自己写一个详细教程&#xff0…

【算法|动态规划No.19】leetcode413. 等差数列划分

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

JAVA反序列化漏洞

JAVA反序列化漏洞 原文资料&#xff1a;xiu–》xiu博客 文章目录 JAVA反序列化漏洞idea类继承反序列化漏洞person类Test类 什么是反序列化漏洞 idea 类继承 public class Person {public int age;public String name;public void talk(){System.out.println("Person 说话…

RK3588 USB WIFI调试

一.安卓wifi框架 要使用一个wifi功能需要涉及的部分有内核部分wifi驱动&#xff0c;应用部分wpa_supplicant服务。其中wifi驱动又包含很多部分&#xff0c;分为通讯接口的驱动SDIO、USB、PCIE等&#xff0c;还有上下电部分的驱动&#xff0c;wifi模组提供部分的驱动。应用部分不…

random生成随机数的灵活运用

random返回的 [0,1) 之间的一个随即小数 思考&#xff1a;请写出获取 a-b 之间的一个随机整数&#xff0c;a,b均为整数&#xff0c;比如 a2 , b7 即返回一个数 x > [2,7]Math.random()*(b-a) 返回的就是 [0,b-a](int)(aMath.random()*(b-a1)) 》 (int)(2Math.random()*6) Ma…

常用傅里叶变换表

傅里叶展开 傅里叶变换 傅里叶逆变换 时域信号 弧频域信号 线性变换 时域平移 频域平移 伸缩变换 微分性质 逆变换的微分性质 卷积定理 原函数变换结果 单位阶跃函数&#xff1a; 符号函数&#xff1a; 矩形函数&#xff1a; 辛格函数&#xff1a;

系统架构师备考倒计时22天(每日知识点)

测试阶段划分 单元测试&#xff1a;依据详细设计&#xff0c;模块测试&#xff0c;模块功能、性能、接口等集成测试&#xff1a;依据概要设计&#xff0c;模块间的接口系统测试&#xff1a;依据需求文档&#xff0c;在真实环境下&#xff0c;验证完整的软件配置项能否和系统正…

了解变分自动编码器 (VAE)

一、介绍 在过去的几年中&#xff0c;由于&#xff08;并暗示&#xff09;该领域取得了一些惊人的进步&#xff0c;基于深度学习的生成模型引起了越来越多的兴趣。依靠大量的数据、精心设计的网络架构和智能训练技术&#xff0c;深度生成模型表现出了令人难以置信的能力&#x…