【C语言】09-深入解析main函数

📅 2026/8/2 7:38:11
【C语言】09-深入解析main函数
作者简介Nebula嵌入式 | 嵌入式软件工程师技术背景22届普通二本院校毕业生专注于嵌入式软件开发MCU/RTOS/Linux应用/Linux驱动开发 持续学习中内容创作小红书、抖音、B站同名账号分享嵌入式知识和日常工作欢迎关注商务合作/需要学习资料联系️nebula0419备注商务合作/学习资料修订记录版本修改时间修改内容1.02023.4.6初稿main 与 argc/argv2.02024.5.21补充命令行传参场景说明3.02026.3.1优化排版4.02026.7.30修正 argc 遍历示例、补充小结4.12026.8.1细化 argc/argv 布局与遍历注意点补强退出码与应用场景说明一、前言在 C 语言学习与开发中main是宿主环境hosted environment如 Linux/Windows 用户态程序下程序的入口。独立环境freestanding常见于裸机启动可能没有标准main由启动文件跳到自定义入口本文以常见的 Linux / 桌面 C 程序为主。本文将从语法格式、声明形式、argc/argv细节入手结合可运行示例说明命令行参数的用法。读图要点宿主环境Linux/桌面入口是main裸机 freestanding 常由启动文件跳到自定义入口。本文以常见main为主MCU 工程以启动文件与链接脚本为准。二、main 函数的语法格式读图要点返回int0成功非 0 错误可供脚本读取。argc含程序名argv是指针数组且argv[argc] NULL。int main(int argc, char *argv[]) { return 0; }核心要素返回值类型int。在 Linux 中返回0表示正常退出非 0 表示错误可由调用方或脚本读取。argcargument count命令行参数个数含程序名本身。argvargument vector指向参数字符串的指针数组argv[argc]为NULL。三、main 函数声明读图要点无参用int main(void)收参用char *argv[]或等价的char **argv。不要写int main()在 C 中表示参数未指定规范性差。形式一不接收命令行参数int main(void) { return 0; }建议使用int main(void)不要写int main()——后者在 C 中表示参数列表未指定可读性与规范性较差。形式二接收命令行参数两种等价写法int main(int argc, char *argv[]) { return 0; } int main(int argc, char **argv) { return 0; }四、参数说明读图要点./test 123 abc→argc3argv[0]程序名其后为用户参数末尾NULL。自定义参数个数 argc - 1有效下标0 ~ argc-1。参数 / 用法说明argc参数个数至少为 1程序名argv[0]通常为程序路径或名称argv[1] … argv[argc-1]用户传入的参数argv[argc]固定为NULL自定义参数个数 argc - 1有效下标为0 ~ argc-1。五、代码示例读图要点推荐for (i 0; i argc; i)或走到argv[i] NULL。不要先while (argc--)再按下标用已被改掉的argc若要递减另存副本。下面用下标遍历打印参数推荐写法。不要先while (argc--)再按argc循环——前者会改掉argc后者就会失效。#include stdio.h int main(int argc, char *argv[]) { int i; printf(argc %d\n, argc); for (i 0; i argc; i) { printf(argv[%d] %s\n, i, argv[i]); } /* 也可写到 argv[argc]NULL 为止 */ for (i 0; argv[i] ! NULL; i) { printf(via NULL: argv[%d] %s\n, i, argv[i]); } return 0; /* 0 表示成功退出 */ }编译并运行假设可执行文件名为test./test 123 abc此时argc为 3对应./test、123、abc。若要边走边减计数应另存副本且与下标循环二选一即可int n argc; char **p argv; while (n--) { printf(%s\n, *p); }六、应用场景读图要点常见用途运行时配置、exec传参、批量任务区间。argv元素都是字符串数值需自行strtol/atoi并做校验。6.1 运行时动态配置无需改代码重编译即可切换行为例如日志级别./app debug/./app info运行模式./server tcp/./server udp文件路径./read_file /home/data.txt6.2 进程启动传参父进程通过exec系列函数启动子进程时可把参数写入子进程的argv完成简单配置传递。6.3 批量任务例如./process_data 100 200表示处理区间提高复用性。七、小结读图要点return 0或exit(0)表示成功非 0 表示错误便于脚本与自动化检测。错误码尽量语义明确不要随意返回随意整数。宿主环境下用int main(void)或int main(int argc, char *argv[])。argc含程序名argv[argc]为NULL成功退出返回0。遍历参数用下标或argv[i] ! NULL避免先破坏argc再循环。嵌入式裸机可能没有标准main以启动文件与链接脚本为准。