va_start 与 va_end

在C语言中,当我们定义一个可变参数的函数时,我们需要一种方法来依次访问每个参数。va_startva_end宏就是用来处理这些可变参数的。

va_start宏的作用是初始化一个va_list类型的变量,这个变量是用来存储和访问可变参数的。va_start应该在函数中对其它参数做任何处理之前调用。要使用va_start宏,你需要两个参数:首先是你定义的va_list类型变量,其次是函数的最后一个非可变参数。你可以把它理解为告诉va_list变量从哪里开始获取可变参数列表。

下面是va_start宏的一个示例:

#include <stdarg.h>

// 假设format是最后一个非可变参数
va_list args;
va_start(args, format);

当你完成了可变参数的处理,并且不再需要va_list类型变量后,你应该使用va_end宏。va_end宏的作用是清理赋予va_list变量的任何资源。虽然在很多实现中,va_end可能仅仅是一个空操作,但它的使用是标准要求的好习惯,可以保证代码的可移植性。

va_end宏是这样使用的:

va_end(args);

它需要va_list类型变量作为参数,并且应该与每一个va_start宏的调用相匹配。

在可变参数的函数中,format并不是一个特定的变量名,它一般代表函数中最后一个固定的参数,用来告诉va_start宏从哪个参数之后开始处理可变参数列表。

理解这个概念可能需要看一个例子。假设我们有一个函数print_formatted,它的第一个参数是一个格式字符串(类似于printf函数中的格式字符串),后面可以跟任意多的参数。这个格式字符串就是我们所说的“最后一个非可变参数”。

例如:

void print_formatted(const char *format, ...) {
  va_list args;
  va_start(args, format); // 这里,format 是最后一个固定参数
  // ...
  va_end(args);
}

在这个例子中,format的角色就是告诉va_start:可变参数开始于format参数之后,因为format是在省略号...之前定义的最后一个参数。这样,当我们在函数内部使用va_list遍历参数时,它会跳过format,从紧随其后的第一个可变参数开始处理。

简而言之,format就是函数签名中,紧邻可变参数省略号...左边的那个参数。这个“格式参数”只是一个占位符,它在不同函数中可以有不同的名字,关键在于它是可变参数之前的最后一个参数。

void dump(void* buf_src, int len, const char *format, ...)
{
    if (buf_src == NULL || len <= 0)
	{
        return;
    }

    va_list args, args_copy;
    va_start(args, format);
    va_copy(args_copy, args);
    int required_len = vsnprintf(NULL, 0, format, args) + 1;
    va_end(args);
    char *str_buf = (char *)malloc(required_len);
    if (str_buf == NULL)
	{
        va_end(args_copy);
        return;
    }
    vsnprintf(str_buf, required_len, format, args_copy);
    va_end(args_copy);

    char *data_buf = (char *)malloc(len * 3);
    if (data_buf == NULL)
	{
        free(str_buf);
        return;
    }
    unsigned char *byte_src = (unsigned char *)buf_src;
    for (int i = 0; i < len; i++) {
        snprintf(&data_buf[3 * i], 4, "%02X ", byte_src[i]);
    }
    data_buf[len * 3 - 1] = '\0';

    printf("%s:%s\n", str_buf, data_buf);
    free(str_buf);
    free(data_buf);
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java项目:基于SSM框架实现的实践项目管理系统(ssm+B/S架构+源码+数据库+毕业论文+开题报告)

一、项目简介 本项目是一套基于SSM框架实现的实践项目管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff…

BIMBase浏览器新功能——碰撞检测

BIMBase浏览器&#xff08;原BIMBase建模软件 Lite&#xff09;全新R1.14版本已经全面上线&#xff0c;新版本下载链接&#xff1a;BIMBase浏览器R1.14。本次给大家介绍一下本次版本的重点功能&#xff1a;碰撞检测。 各位设计院/施工单位/运维单位的伙伴们在模型交付、方案讨论…

第三节课,功能2:开发后端用户的管理接口5min(用户的查询/状态更改)【4】【9开始--本人】

一、代码任务 【录个屏】 二、写代码 2.1 代码文件位置 2.2 代码如下&#xff1a; 2.3 官方文档&#xff1a; 网址&#xff1a; 逻辑删除 | MyBatis-Plus (baomidou.com) 三、代码有bug&#xff0c;没有鉴权&#xff0c;表里添加一个字段。role 管理员 3.1 判断操作的人&am…

【开发工具】pythontutor——在线内存可视化工具

笔者在学习RISC-V时&#xff0c;希望找到一款可视化的内存工具&#xff0c;遗憾目前还未找到。发现了pythontutor这个网站&#xff0c;可以对C、python等多种语言进行内存可视化。结果似乎是x86架构的&#xff0c;符合小端存储。 贴一下网址&#xff0c;原准备依据开源版本进行…

什么是MOM?为什么它是趋势

制造运营管理&#xff08;MOM&#xff09; 制造运营管理&#xff08;MOM&#xff09;旨在优化制造流程的效率和有效性。它涵盖制造执行、质量管理、生产计划和调度以及制造智能等功能。这种解决方案以全面的方式管理和增强制造流程。 MOM的功能特点 对于MOM的功能特点来说&…

爬虫自动调用shell通过脚本运行scrapy爬虫(crawler API)

一、爬虫时如何同时调用shell 1)终端cd项目>>scrapy crawl example 2)打开example.py import scrapy from scrapy.shell import inspect_response#引入shellclass ExampleSpider(scrapy.Spider):name "example"allowed_domains ["example.com"]…

兄弟们,哪一家做智慧校园的公司比较靠谱?

开发技术参数 1、使用springboot框架Javavue2 2、数据库MySQL5.7 3、移动端小程序使用小程序原生语言开发 4、电子班牌固件安卓7.1&#xff1b;使用Java Android原生 5、elmentui &#xff0c;Quartz&#xff0c;jpa&#xff0c;jwt 6、SaaS云平台&#xff0c;私有云部署…

iview 自定义项求和的方法和错误点

这是iview自定义某几项参数合计的方法&#xff0c;其实是蛮简单的&#xff0c;很多人自定义合计的时候&#xff0c;老是会不知道怎么处理除了需要合计的几项的其他项&#xff0c;其实不需要管&#xff0c;不需要合计的项直接返回空就好了&#xff0c;需要的就在计算的里面做key…

Llama 3 ——开源大模型Llama 3从概念到使用

概述 Meta公司自豪地宣布推出其最新的开源大型语言模型——Llama 3&#xff0c;这是一款专为未来AI挑战而设计的先进工具。Llama 3包含两个不同参数规模的版本&#xff0c;以满足多样化的计算需求&#xff1a; 8B版本&#xff1a;优化了在消费级GPU上的部署和开发流程&#xf…

初识MVC

初识MVC 理论部分 今天第一次学MVC&#xff0c;拿到一个练手项目。现在来记录一下学习过程。 项目的背景就是个学生管理系统。我只做后端。 从大的来说MVC将应用程序分为三个主要组件&#xff08;部分&#xff09;&#xff1a; 模型&#xff08;Model&#xff09;是应用程序…

SGP.31-05

6.1.1 eIM触发下载过程 6.1.2 eIM Initiated Direct Profile Download with SM-DS 在文档的“6.1.2 eIM 发起的通过 SM-DS 的直接配置文件下载”部分&#xff0c;描述了两种直接从 SM-DP 到 eUICC 的配置文件下载选项。以下是每个步骤的概述&#xff1a; ### 开始条件&…

​基于Python的在线自主评测系统(django)​

基于Python的在线自主评测系统(django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 学生功能模块的实现 学生注册的实现 学生登录界面首页 在线考试界面 考试成绩查看界面 教师功能模块的实现 新建…

以全栈智算拥抱生态,为AIGC种一棵向上生长的巨榕

榕树&#xff0c;被称为百木之王。它既有极深的根&#xff0c;又有繁茂的叶。只要一棵榕树长成&#xff0c;就能够独木成林&#xff0c;遮天蔽日。更可贵的是&#xff0c;榕树可以为树荫下繁茂的生态提供支撑&#xff0c;形成“一榕生&#xff0c;万物长”的格局。 开年以来&am…

MySQL中SELECT语句的执行过程

2.1.1. 一条SELECT语句的执行过程 MySQL 的架构共分为两层&#xff1a;Server 层和存储引擎层 Server层负责建立连接、分析和执行SQL存储引擎层负责数据的存储和提取&#xff0c;支持 InnoDB、MyISAM、Memory 等多个存储引擎&#xff0c;MySQL5.5以后默认使用InnoDB&#xff0…

set_input_delay的理解

1&#xff0c;set_input_delay约束理解 input_delay是指输入的数据到达FPGA的pad引脚时相对于时钟边沿的延迟有多大&#xff0c;单位是ns&#xff0c;数值可以是正&#xff0c;也可以是负。通过set_input_delay约束告诉编译器输入时钟和输入数据的相位关系。如下图所示假设时钟…

RSA加密---java和node兼容版(可直接复制使用)

目录 背景 实现 一、node代码 1、引入依赖 2、生成公钥和私钥 3、生成工具类 二、java代码 背景 本来项目的后端是node&#xff0c;里面登录接口用的是后端生成RSA公钥和私钥&#xff0c;公钥给前端网页用来加密&#xff0c;node后端解密&#xff0c;一切很和谐&#x…

Flexible布局在Web前端开发中的实际应用

随着Web前端技术的不断发展&#xff0c;Flexible布局&#xff08;弹性布局&#xff09;已成为现代网页设计中不可或缺的一部分。它提供了一种高效、灵活的方式来组织和管理页面元素&#xff0c;使开发者能够轻松应对各种复杂的布局需求。本文将通过一个实际的应用案例来介绍Fle…

鸿蒙内核源码分析(汇编基础篇) | CPU在哪里打卡上班

本篇通过拆解一段很简单的汇编代码来快速认识汇编&#xff0c;为读懂鸿蒙汇编打基础.系列篇后续将逐个剖析鸿蒙的汇编文件. 汇编很简单 第一&#xff1a; 要认定汇编语言一定是简单的&#xff0c;没有高深的东西&#xff0c;无非就是数据的搬来搬去&#xff0c;运行时数据主要…

阿里云服务器(Ubuntu22)上的MySQL8更改为大小写不敏感

因为windows上默认的mysql8.0是大小写不敏感的&#xff0c;部署到服务器上之后发现ubuntu默认的是大小写敏感&#xff0c;所以为了不更改代码&#xff0c;需要将mysql数据库设置为大小写不敏感的。 &#xff01;&#xff01;&#xff01;重要一定要做好数据库的备份&#xff0…

【Vue3】openlayers加载瓦片地图并手动标记坐标点

目录 一、创建Vue3项目 二、openlayers加载瓦片地图&#xff08;引js文件版&#xff09; 2.1 将以下的文件复制到public下 2.2 index.html引入ol脚本 2.3 删除项目自带的HelloWorld.vue&#xff0c;创建Map.vue 2.4 编码Map.vue 2.5 修改App.vue 2.6 启动项目测试 三、…
最新文章