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

C语言 - 输出参数详解:从简单示例到 alloc_chrdev_region

C语言中的输出参数详解:以 alloc_chrdev_region 为例

在学习 C 语言函数调用时,我们常常接触到“输入参数”,比如把一个数字传给函数,让函数帮我们算出结果。但有时候可能会发现,有些函数除了返回值之外,还会让我们传一个指针参数进去,用来返回额外的结果。这类指针参数就叫 输出参数

本文将从零理解输出参数的概念,先从一个简单的例子入手,再结合 Linux 驱动开发中的 alloc_chrdev_region 函数做深入解析。

一、什么是输出参数?

在 C 语言中,函数有一个返回值,但有时候我们希望函数能够返回多个结果。这时候,就可以通过 指针 把结果写回给调用者,这个指针参数就是输出参数。

  • 输入参数:函数从调用者那里获取的值。
  • 输出参数:函数通过指针写回调用者的值。

简而言之:输入参数进函数,输出参数出函数。

二、一个简单的例子

假设我们要写一个函数:给定一个整数,计算它的平方和两倍,并返回给调用者。

错误思路:只能返回一个值

int calc(int x) {return x * x;  // 只能返回平方,没法返回两倍
}

这样只能返回一个结果,不够用。

正确思路:用输出参数

#include <stdio.h>void calc(int x, int *square, int *twice) {*square = x * x;   // 通过指针写回平方*twice  = x * 2;   // 通过指针写回两倍
}int main() {int s, t;calc(5, &s, &t);printf("平方 = %d, 两倍 = %d\n", s, t);return 0;
}

运行结果:

平方 = 25, 两倍 = 10

在这里:

  • int *square, int *twice输出参数
  • 函数通过 *square*twice 把结果写回。

这样,函数就相当于“返回了多个结果”。

三、Linux 驱动开发中的例子:alloc_chrdev_region

在 Linux 字符设备驱动开发中,我们经常会调用 alloc_chrdev_region 来向内核申请一个设备号。

函数原型

int alloc_chrdev_region(dev_t *dev, unsigned baseminor,unsigned count, const char *name);

参数说明:

  • dev:输出参数,指向 dev_t 变量,用来存放分配到的设备号。
  • baseminor:起始次设备号。
  • count:需要的设备数量。
  • name:设备名称,会显示在 /proc/devices

返回值:

  • 0 表示成功。
  • 小于 0 表示失败。

使用示例

#include <linux/fs.h>static dev_t dev_num;  // 保存分配到的设备号int result = alloc_chrdev_region(&dev_num, 0, 1, "hello_drv");
if (result < 0) {printk("分配设备号失败!\n");
} else {printk("成功分配到设备号:主设备号=%d, 次设备号=%d\n", MAJOR(dev_num), MINOR(dev_num));
}

这里:

  • &dev_num 作为输出参数传给函数。
  • 内核在函数内部写入分配好的设备号到 *dev,也就是 dev_num
  • 我们调用 MAJOR(dev_num)MINOR(dev_num) 就能拿到主次设备号。

为什么要用输出参数?

因为 alloc_chrdev_region 既要告诉我们“执行成功还是失败”,又要把“分配到的设备号”返回回来。一个返回值不够用,所以就把设备号通过输出参数返回。

四、总结

  1. 输出参数的本质:通过指针让函数“返回”额外的结果。
  2. 适用场景:当一个函数需要返回多个值时。
  3. 简单例子:计算平方和两倍,用指针参数返回。
  4. 实际应用alloc_chrdev_region 用输出参数返回分配到的设备号。

总结:

返回值表示成功与否,输出参数返回结果数据。

这就是为什么 alloc_chrdev_regiondev_t *dev 参数一定要传指针的原因。


(完)

http://www.xdnf.cn/news/19359.html

相关文章:

  • Spring AI 的应用和开发
  • 如何简单建设一个网站,让用户快速找到你。
  • 在PowerPoint和WPS演示让蝴蝶一直跳8字舞
  • Python生成免安装exe
  • SAP PP模块的MPS
  • Vue加载速度优化,verder.js和element.js加载速度慢解决方法
  • 防火墙技术(二):安全区域
  • C#调用c++ dll读取2进制文件时而正常,时而异常
  • 语义分割目前还是研究热点吗?
  • 如何快速了解项目管理基础
  • 【具身智能】【机械臂】机械臂轨迹规划项目以及资料汇总【持续更新】
  • 【物联网】MQTT / Broker / Topic 是什么?
  • windows 谷歌浏览器把英文改成中文
  • 【路由器】TP Link 路由器为何无法进入管理后台
  • 关于铭飞平台企业官网模板使用中常到的问题、企业官网的百度认证以及IDEA编辑启动器的快捷方法/Apipost本地和云端没法同步的问题解决
  • 【软考架构】SOA与微服务解疑
  • React Hooks深度解析与最佳实践:提升函数组件能力的终极指南
  • Unity笔记(八)——资源动态加载、场景异步加载
  • 迷你电脑用到什么型号的RJ45网口
  • 揭秘表格推理的“思维革命”:RoT模型介绍
  • seafile-setup-troubleshooting_# Seafile 安装与问题解决记录 # Seafile/Seahub 启动问题记录文档
  • linux基础——UDP、TCP
  • JavaScript之性能优化
  • 深入理解C++中的移动赋值与拷贝赋值函数——兼论移动构造函数及其实际应用场景
  • STM32手动移植FreeRTOS
  • 【学Python自动化】 1. Python 安装与配置完全指南 (Windows)
  • 从“互联网+”到“人工智能+”:云计算生态演进揭示AI应用破局之道
  • springboot 实现不同接口指定上传文件大小
  • 腾讯云centos7.6的运维笔记——从yum的安装与更新源开始
  • 小狼毫输入法中让数字键盘上的数字键不再选择候选词而是与原始输入一起直接上屏