当前位置: 首页 > news >正文

C 语言的void*到底是什么?

一、void* 的类型任意性

void* 是一种通用指针类型。它可以指向任意类型的数据。例如,它可以指向一个整数(int)、一个浮点数(float)、一个字符(char)或者一个结构体等。在C语言中,当你使用void*指针时,你不需要在编译时指定它将指向的数据类型。这使得void* 在一些需要通用指针的场景下非常有用,比如在内存分配函数malloc中返回的就是void*类型的指针。因为malloc函数不知道用户将要分配的内存用于存储哪种类型的数据,所以它返回一个void*指针,用户可以根据自己的需要将其转换为特定类型的指针。
例如:

void* ptr = malloc(10 * sizeof(int));
int* intPtr = (int*)ptr;  // 将void*指针转换为int*指针

在这个例子中,void*指针 ptr 可以指向分配的内存区域,然后通过类型转换将其转换为int*指针,用于存储整数数组。

二、编译器对 void* 的类型检查

编译时不做类型检查(针对void*本身)编译器在编译时不会对void*指针本身进行类型检查。因为 void* 表示“未知类型”的指针,编译器无法知道它实际指向的数据类型。所以,当你对void指针进行操作(如赋值等)时,编译器不会检查其指向的数据类型是否正确。例如,你可以将一个指向整数的指针赋值给void指针,也可以将一个指向字符的指针赋值给void*指针,编译器都不会报错。

int a = 10;
char b = 'k';
void* vp1 = &a;
void* vp2 = &b;

在这个例子中,vp1和vp2都是void*指针,分别指向了不同类型的变量a和b,编译器不会对这种赋值操作进行类型检查。

三、需要显式类型转换

当你想要使用 void* 指针访问其中的某个值时,通常需要先将其转换为特定类型的指针,然后通过转换后的指针来访问值。在转换时,你需要明确指定目标类型,编译器会对转换后的指针类型进行检查。例如,如果你想通过 void* 指针访问一个整数的值,你需要先将其转换为 int* 指针。
例如:

void* vp = malloc(sizeof(int));
*(int*)vp = 20;  // 先将void*转换为int*,然后通过int*指针赋值

在这个例子中,vp是一个void*指针,指向分配的内存。在给这块内存赋值之前,需要先将其转换为int*指针。如果转换的目标类型和实际存储的数据类型不匹配,可能会导致运行时错误。 比如,如果这块内存实际上存储的是一个浮点数,而你将其转换为int*指针并访问,可能会得到错误的结果或者引发程序异常。编译器在转换时会检查语法是否正确(如是否有合适的类型转换操作),但对于类型转换的正确性(即是否符合程序的实际逻辑)主要依赖于程序员的正确使用。

占用的字节

一、32位系统
在32位系统中,void* 指针通常占据4个字节。这是因为32位系统中的内存地址空间是2的32次方(即4GB),用4个字节(32位)就可以表示一个内存地址。例如,在一个32位的Windows系统或者32位的Linux系统上,无论是void指针,还是其他类型的指针(如int、char*等),它们都占据4个字节。这4个字节存储的是一个内存地址,这个地址可以指向进程地址空间内的任意位置。

二、64位系统
在64位系统中,void* 指针通常占据8个字节。64位系统有更大的内存地址空间,理论上可以达到2的64次方字节。因此,需要用8个字节(64位)来表示一个完整的内存地址。在64位系统上,无论是 void* 指针,还是其他类型的指针,它们的大小都是8个字节。这使得64位系统能够访问更大的内存空间,支持更大的数据处理和更复杂的程序运行。

四、总结

通过我们上面的介绍, 我们发现 void* 在 C 语言中是经常使用的, 它主要有下面这几个方案:

  1. 第一个方案就是作为结构体的字段, 这样我们可以去表示对应的范型字段
  2. 函数的参数, 或者返回值, 但是我觉得这种最好少用, 因为导致对应的接口不够明确
  3. 各种内存相关的函数, 这其实就是一个很奇妙的东西, 因为在操作系统级别, 我们并不知道这块内存到底是什么类型的变量

约定: 当我们在使用 void* 的时候, 我们最好弄清楚当前这个指针指向的信息, 可以通过明确的变量名来完成

相关文章:

C 语言的void*到底是什么?

一、void* 的类型任意性 void* 是一种通用指针类型。它可以指向任意类型的数据。例如,它可以指向一个整数(int)、一个浮点数(float)、一个字符(char)或者一个结构体等。在C语言中,当…...

Linux中的文件上传和下载

Linux中的文件上传和下载 一、连接 SFTP 在 SecureCRT 中,将鼠标移动到连接窗口的标题上,按鼠标右键,选择“连接 SFTP”标签,即可进入 SFTP 模式。 二、基本指令及用途 1. 显示当前目录 显示本地当前目录:lpwd 示例…...

DDD - 微服务落地的技术实践

文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…...

fgets、scanf存字符串应用

题目1 夺旗(英语:Capture the flag,简称 CTF)在计算机安全中是一种活动,当中会将“旗子”秘密地埋藏于有目的的易受攻击的程序或网站。参赛者从其他参赛者或主办方偷去旗子。 非常崇拜探姬的小学妹最近迷上了 CTF&am…...

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加,以及为了与iOS、Android 端统一页面跳转路由,以及动态下发路由链接,路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理,类似于 iOS与Android的实…...

Spring-boot3.4最新版整合swagger和Mybatis-plus

好家伙,今天终于开始用spring-boot3开始写项目了,以后要彻底告别1.x和2.x了,同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于…...

基于Java的高校实习管理平台

基于Java的高校实习管理平台是一个专为高校设计的信息化管理工具,旨在通过信息化手段简化实习管理流程,提高管理效率,增强学校、企业与学生之间的沟通与协作。: 一、系统背景与意义 随着教育体系的不断完善和就业市场的日益竞争…...

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之一维数组(应用技巧)

二、一维数组应用技巧2:打标记 实战训练1—开关灯 问题描述: 有 M个从1到M依次编号的人参加一项游戏。将K 盏从1到K依次编号的灯(K和M均为正整数,M≤K≤5000)进行一系列的熄灭与打开的操作,游戏开始时均处于亮灯的状态&#xf…...

【2024年华为OD机试】 (B卷,100分)- 路灯照明问题(Java JS PythonC/C++)

一、问题描述 路灯照明问题 题目描述 在一条笔直的公路上安装了 ( N ) 个路灯,从位置 0 开始安装,路灯之间间距固定为 100 米。每个路灯都有自己的照明半径。请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。 输入描述 第一…...

SVGAPlayer error 处理

提示错误 Call to undeclared function OSAtomicCompareAndSwapPtrBarrier; ISO C99 and later do not support implicit function declarations Conflicting types for OSAtomicCompareAndSwapPtrBarrier Declaration of OSAtomicCompareAndSwapPtrBarrier must be imported …...

2024年12月电子学会青少年机器人技术等级考试(二级)实际操作试卷

2024.12 青少年机器人技术等级考试(二级)实际操作试卷 一、多选题 第 1 题 关于后轮驱动车说法正确的有哪些?( ) A.起步加速表现比前轮驱动好 B.容易转向过度 C.车身重量比前轮驱动更均衡 D.造价比前轮驱动车更高…...

Swift 专题二 语法速查

一 、变量 let, var 变量是可变的,使用 var 修饰,常量是不可变的,使用 let 修饰。类、结构体和枚举里的变量是属性。 var v1:String "hi" // 标注类型 var v2 "类型推导" let l1 "标题" // 常量class a {…...

Api网关Zuul

网关分类与开放API 开放API (OpenAPI) 企业需要将自身数据、能力等作为开发平台向外开放,通常会以REST的方式向外提供,最好的例子就是淘宝开放平台、腾讯公司的QQ开发平台、微信开放平台。开放API平台必然涉及到客户应用的接入、API权限的管理、调用次数…...

01设计模式(D3_设计模式类型 - D3_行为型模式)

目录 一、模版方法模式 1. 基本介绍 2. 应用案例一:豆浆制作问题 需求 代码实现 模板方法模式的钩子方法 3. View的draw(Android) Android中View的draw方法就是使用了模板方法模式 模板方法模式在 Spring 框架应用的源码分析 知识小…...

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测

角点检测(Corner Detection)是计算机视觉和图像处理中重要的步骤,主要用于提取图像中的关键特征,以便进行后续的任务,比如图像匹配、物体识别、运动跟踪等。下面介绍几种常用的角点检测方法及其应用。 1. Harris角点检…...

费解的开关

费解的开关 你玩过“拉灯”游戏吗? 25 盏灯排成一个 55 的方形。 每一个灯都有一个开关,游戏者可以改变它的状态。 每一步,游戏者可以改变某一个灯的状态。 游戏者改变一个灯的状态会产生连锁反应:和这个灯上下左右相邻的灯也…...

【机器学习】机器学习引领数学难题攻克:迈向未知数学领域的新突破

我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 一、引言 在数学的浩瀚领域中,存在着诸多长期未解的难题,这些难题犹如高耸的山峰,吸引着无数数…...

Qt之QDjango-db的简单使用

QDjango是一款由C编写、依托于Qt库的Web开发框架,其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集,帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango&…...

缓存、数据库双写一致性解决方案

双写一致性问题的核心是确保数据库和缓存之间的数据同步,以避免缓存与数据库数据不同步的问题,尤其是在高并发和异步环境下。本文将探讨双写一致性面临的主要问题和解决方案,重点关注最终一致性。 本文讨论的是最终一致性问题 双写一致性面…...

SUnet: A multi-organ segmentation network based on multiple attention【医学图像分割】

一、论文信息 1.1、中文名称 名称:SUnet:基于多重注意力的多器官分割网络 1.2、论文关键词 医学图像分割、Transformer、注意力机制、高效特征融合模块 1.3、核心概述 本文提出了一种新颖有效的医学图像分割方法 SUnet,用于腹部和胸部的多…...

Appium启动参数避坑指南:新手常犯的5个错误及解决方案

Appium启动参数避坑指南:新手常犯的5个错误及解决方案 在移动应用UI自动化测试领域,Appium作为一款开源的跨平台测试框架,凭借其强大的兼容性和灵活性赢得了众多测试工程师的青睐。然而,对于刚接触Appium的新手来说,启…...

从Proteus仿真到实战:51单片机驱动ADC0808构建智能电压监测系统

1. 从基础电压表到智能监测系统的升级思路 很多电子爱好者第一次接触51单片机时,都会尝试制作数字电压表这个经典项目。我当年在学校实验室里,也是从这个小项目开始入门的。但基础电压表只能显示数值,就像只会报数的机器人,缺少实…...

掌握类人记忆,解锁AI大模型潜力:小白也能轻松收藏学习!

AI智能体(Agent)的热度不减,然而许多Agent系统都有一个共同的痛点就是“健忘症”,尤其是上下文过长时,更为明显。这种缺乏长期、连贯记忆的能力,极大地限制了AI智能体的潜力和用户体验。它们很难真正理解用…...

别再只传整数了!手把手教你用AXI4-Lite在ZYNQ里搞定浮点数传输(附完整Vivado工程)

别再只传整数了!手把手教你用AXI4-Lite在ZYNQ里搞定浮点数传输(附完整Vivado工程) 在ZYNQ的软硬件协同开发中,数据交互是最基础却最容易踩坑的环节。许多开发者习惯性地使用整型数据进行PS与PL间的通信,直到某天需要传…...

Go语言的context.WithTimeout超时控制与取消信号在网络编程中的传播

Go语言在网络编程中因其高并发特性广受青睐,而context.WithTimeout提供的超时控制与取消信号传播机制,成为构建健壮分布式系统的关键工具。当服务需要调用外部API、数据库或微服务时,超时与取消逻辑能有效避免资源泄漏和级联故障。本文将深入…...

SAP的定义与背景

SAP(Systems, Applications, and Products in Data Processing)是一家德国软件公司,也是其核心企业资源规划(ERP)软件的名称。SAP ERP系统用于整合企业业务流程,涵盖财务、物流、人力资源、生产等模块&…...

嵌入式TFTP服务器库TFTPServer深度解析与移植指南

1. TFTPServer嵌入式TFTP服务器库深度解析TFTP(Trivial File Transfer Protocol)作为轻量级文件传输协议,在嵌入式系统固件升级、配置文件下发、日志回传等场景中具有不可替代的地位。其基于UDP的无连接特性、极简的状态机设计、零会话开销等…...

科研利器:wandb实战指南——从实验可视化到智能调参

1. 为什么科研人员都在用wandb? 第一次听说wandb是在实验室组会上,隔壁组的博士师兄展示了他训练神经网络的可视化曲线——那些实时跳动的损失函数和准确率图表,让整个训练过程像看股票大盘一样直观。当时我就被震撼到了:这不就是…...

5分钟快速上手:抖音批量下载神器完整使用指南

5分钟快速上手:抖音批量下载神器完整使用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...

「React + Resium 从零搭建三维地球,比你想象中简单」

官网地址:点我 一、效果预览 二、项目初始化 2.1 创建 React 项目 # 使用 Vite 创建 React TypeScript 项目 pnpm create vite react-cesium-starter --template react-ts cd react-cesium-starter# 或者使用 CRA(不推荐,较慢)…...