argc 和 argv 是 main 函数的两个普通形参:argc 为整型,表示参数个数;argv 为 char** 类型,指向参数字符串数组,合法访问范围是 argv[0] 到 argv[argc-1]。

argc 和 argv 的本质是什么
它们不是特殊语法,而是 main 函数的两个形参:整型 argc 表示参数个数,字符指针数组 argv 指向每个参数字符串的首地址。argv 类型是 char**(或等价的 char*[]),意味着你可以用指针算术遍历它,也能对单个 argv[i] 做字符串操作。
遍历 argv 时常见的空指针崩溃
错误常发生在假设 argv[argc] 是 nullptr 并拿来解引用——标准不保证这点,越界读 argv[argc] 是未定义行为。安全做法是只访问 argv[0] 到 argv[argc-1]。
- 正确循环写法:
for (int i = 0; i - 若想用指针递增方式:
for (char** p = argv; p - 别写
while (*p) { ... ++p; }—— 这依赖argv[argc] == nullptr,不可靠
把 argv[i] 当作 C 字符串用时要注意什么
argv[i] 指向的是以 '<p><code>argv[i] 指向的是以 '\0' 结尾的只读内存区域(通常在进程数据段或栈上),不能直接修改内容。比如 argv[1][0] = 'X'; 可能触发段错误。
argv[1][0] = 'X'; 可能触发段错误。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 需要修改参数内容?先用
strdup(argv[i])或std::string(argv[i])拷贝一份 - 解析选项(如
-v、--help)时,推荐用std::string_view(argv[i])避免拷贝,但注意其生命周期仅限于程序启动阶段 - 用
strcmp(argv[i], "-o") == 0判断选项比argv[i] == "-o"安全得多——后者比较的是地址,不是内容
argc/argv 在不同平台上的内存布局差异
Linux 和 macOS 下,argv 数组和所有字符串通常连续分配在栈上;Windows 的 MSVC 运行时则可能将字符串放在堆或只读数据段。但这不影响你用指针访问,只要不越界、不写只读内存。
- 不要假设
argv[0]和argv[1]地址相邻——它们指向不同字符串,中间可能有空隙 - 也不该用
sizeof(argv)获取数组长度——在函数参数中,argv已退化为指针,sizeof返回指针大小(通常是 8) - 真正可靠的长度只有
argc,它是唯一权威来源
最常被忽略的一点:argv[0] 不一定是可执行文件名——它由调用者传入,可能是任意字符串,甚至为空。依赖 argv[0] 推导程序路径时,必须做非空和有效性检查。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










