指针大小与sizeof

news/2025/3/10 21:16:30/文章来源:https://www.cnblogs.com/fuhao2/p/18763589

1.0 sizeof介绍

  sizeof是一个关键字, sizeof(x): 编译器给我们查看内存空间容量的⼀个⼯具,在编译时计算并确定出x在内存中所占字节数。

  • sizeof 返回 size_t 类型,这是一个定义在 <stddef.h>(C)或 (C++)中的无符号整数类型。
  • 输出时应使用 %zu(C/C++)或 std::cout(C++),避免类型不匹配警告。

1.1 sizeof的语法形式

  • 对类型:sizeof(type),必须加括号(如 sizeof(int))。
  • 对变量:sizeof variable 或 sizeof(variable),括号可选(但建议统一使用括号)。

1.2 sizeof的常见使用

  1. 基本类型
sizeof(int);     // 通常 4(32/64位系统)
sizeof(char);    // 1(始终为 1 字节)
sizeof(double);  // 通常 8
  1. 指针
int* p;
sizeof(p);       // 指针大小(32位系统为4,64位系统为8)
sizeof(*p);      // 指向的数据类型大小(int,通常4)
  1. 数组
int arr[10];
sizeof(arr);     // 返回整个数组的大小(10 * sizeof(int))
// 数组名在 sizeof 中不退化为指针!// 计算数组元素个数:
size_t count = sizeof(arr) / sizeof(arr[0]);  // 10
  1. 结构体和类
struct S {char c;      // 1 字节int i;       // 4 字节// 可能包含 3 字节填充(对齐到4)
};
sizeof(S);       // 可能为 8(因内存对齐)

1.3 sizeof的常见误解

  1. 误解:sizeof 返回动态分配内存的大小
int* p = malloc(10 * sizeof(int));
sizeof(p);  // 返回指针大小(如8),而非分配的内存大小!
  1. 误解:sizeof 计算字符串长度
const char* s = "hello";
sizeof(s);       // 指针大小(如8)
sizeof("hello"); // 6(包含 '\0' 的字符数组大小)
strlen("hello"); // 5(不包含 '\0')
  1. 误解:sizeof 对表达式求值
int a = 0;
sizeof(a++);     // 等价于 sizeof(int),a 仍为0!
  1. 误解:结构体大小等于成员总和
struct Packed {   // 可能占用 5 字节(无填充)char c;int i;
} __attribute__((packed));  // GCC 特性,取消填充
  1. 误解:C 和 C++ 中 sizeof('a') 相同
// C 中 'a' 是 int 类型,sizeof('a') 返回4;
// C++ 中 'a' 是 char 类型,返回1。
  1. 误解:sizeof 的返回值是 int
// 错误用法:
printf("%d\n", sizeof(int));  // 可能警告(格式不匹配)
// 正确用法:
printf("%zu\n", sizeof(int));  // C99/C++11 支持

2.0 指针大小

  在 C/C++ 中,指针的大小取决于系统的架构和编译环境,而不是指针指向的数据类型。

  1. 指针大小的通用规则
  • 32 位系统:指针大小为 4 字节(32 位地址空间)。
  • 64 位系统:指针大小为 8 字节(64 位地址空间)。

  无论指针类型是 int*、char* 还是其他类型,它们的 sizeof 结果一致(但函数指针可能有例外,见下文)。

  1. 验证 sizeof 的结果
#include <iostream>int main() {std::cout << "sizeof(int*)    = " << sizeof(int*) << std::endl;     // 例如:8(64位系统)std::cout << "sizeof(char*)   = " << sizeof(char*) << std::endl;    // 同上std::cout << "sizeof(void*)   = " << sizeof(void*) << std::endl;    // 同上std::cout << "sizeof(double*) = " << sizeof(double*) << std::endl;  // 同上return 0;
}

参考

  • 【嵌入式C语言高阶版】 https://www.bilibili.com/video/BV1qCSkY7EyD/?p=15&share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91
  • 【嵌入式八股文面试题合集-嵌入式工程师笔试面试100题 校招社招必备 嵌入式开发/Linux/STM32单片机/C语言/C++/Qt/秋招春招/FreeRTOS】 https://www.bilibili.com/video/BV17n6PY7EYB/?p=2&share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Power Automate发送图文并茂的Teams消息

前言最近,有朋友使用Automate发送Teams消息,发现如果图片在SharePoint中,发送的时候因为认证的问题图片没办法显示。其实,我们可以将图片转换成Base64流进行引用,就能正常的显示了。正文1.我们新建一个Automate Flow,如下图:2.然后,添加Teams操作,如下图:3.消息我们需…

006TypeScript开发实战

一、全家桶-状态管理 状态管理的选择 vuex:目前依然使用较多的状态管理库 pinia:强烈推荐,未来趋势的状态管理库(用这个)1、 安装:npm install pinia 安装完成 2、新建文件夹 这里这样写 这里引入pinia 新建文件 这样写 这里引用一下 可以看到页面上 点击之后变成

《Python极客项目编程(第2版)》 | PDF免费下载 | epub free download

本书并不介绍Python语言的基础知识,而是通过一系列有趣的项目,展示如何用Python解决各种实际问题,以及如何使用一些流行的Python库。点击下载书籍信息 作者: [美] 马赫什文基塔查拉姆(Mahesh Venkitachalam) 出版社: 人民邮电出版社 原作名: Python Playground: Geeky Pro…

课堂教学质量评价分析系统 AI+教育

课堂教学质量评价分析系统的核心技术基于YOLOv11和CNN算法,课堂教学质量评价分析系统检测到的行为数据(如玩手机、举手、睡觉、交头接耳、趴桌子、行走运动)和表情数据(如开心、厌恶、愤怒、悲伤、沮丧、恐惧、无表情)会被传递到情感模型进行进一步分析。同时,系统还会结…

04. 串口通信

一、串口通信简介串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。串口通信的数据包由发送设备的 TXD 接口传输到接收设备的 RXD 接口。在串口通信的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式…

【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享

问题描述 当在AKS中遇见复杂的网络问题,想要进入到特定的POD中来抓取网络文件包进行分析。特分享抓取网络包的方法!操作步骤 第一步:使用kubectl get pods命令确认问题Pod所在的Node 第二步:使用node shell登录到相应node上 kubectl node-shell <node name> 第三步:…

App虚拟机环境搭建

App虚拟机环境搭建 在uniapp的开发环境中,我想要搭建一个平台完成对于app的开发,所以要配置app的基本环境和安装虚拟机 虚拟机安装 这里使用Mumu虚拟机.直接从官网下载然后傻瓜式安装https://mumu.163.com/搭建环境 主要是给虚拟机的接口和abd.exe文件的地址找到,配置到HBuilde…

nodejs的下载安装

首先进入官网https://nodejs.cn/download/ 左边是稳定版,右边是最新版,安装自己想要的版本 安装到自己想要的路径下 一直next,这步不要勾选 然后install 在安装路径下创建两个文件夹,分别是node_cache和node_global 配置环境变量 再在系统path中添加%NODE_HOME%、%NODE_HOM…

安卓虚拟机的创建

在android studio上创建一个安卓虚拟机 可以选择手机型号 可选的都是谷歌的手机 而且对应的ui都是原生安卓ui 随便选就好 记得安卓版本不要太老,没必要虚拟机运行起来之后就会在边上有个视图

android studio的下载

进入android studio官网下载即可,中间所有东西点同意和next就行

Vue3--ref - reactive

reactive可以深层次对比ref定义对象类型是借用reactive总结

征程 6 工具链 BEVPoolV2 算子使用教程 【2】-BEVPoolV2 QAT 链路实现示例

1.引言 在上一篇帖子中,我们已详尽阐述了 BEVPoolV2 相较于 BEVPoolV1 的改进之处,并对 BEVPoolV2 实现的代码进行了解析。想必大家对 BEVPoolV2 算子的功能及实现已有了一定程度的理解,此篇帖子将展示 征程 6 工具链 BEVPoolV2 单算子 QAT 链路的实现范例,以进一步增进用户…