argc 是 int 类型,表示命令行参数个数(含程序名);argv 是 char*[] 类型,为指向 C 风格字符串的指针数组,由操作系统在启动程序时传入,argv[argc] 保证为 nullptr。

argc 和 argv 到底是什么类型、从哪来
它们是 main 函数的两个形参,由操作系统在启动程序时传入:int argc 表示命令行参数个数(含程序名),char* argv[] 是指向 C 风格字符串的指针数组,每个元素对应一个参数。
注意:argv[0] 是程序被调用时使用的路径或名称(可能带路径,也可能只是 basename),不一定是可执行文件真实路径;argv[argc] 保证为 nullptr,这是 C 标准要求的守卫值。
- 不要假设
argv[0]可读或存在 —— 某些嵌入式环境或沙箱中它可能是空指针 -
argv中的字符串内容不可修改(C++11 起标准明确为char* argv[],但实际常量性由实现保障;修改可能导致未定义行为) - 没有
const char* argv[]的签名,但你应按只读方式使用
常见错误:把 argv 当作 vector 直接遍历
直接写 for (auto s : argv) 会编译失败,因为 argv 是数组退化成的指针,不是容器;更危险的是用 argv + i 超出 argc 范围访问 —— 这不是越界检查问题,而是逻辑错误,argv[argc] 虽为 nullptr,但 argv[argc+1] 就彻底失控了。
正确做法是控制索引范围,并做空指针防御(尽管标准保证 argv[argc] == nullptr,但中间项理论上可能为空,尤其当 shell 注入异常参数时):
std::vector(argv, argv + argc)
- 必须逐个检查
argv[i]是否非空再构造std::string - 如果需要长期持有副本,建议用
std::vector<:string>;若仅遍历解析,直接操作argv更轻量 - Windows 下宽字符(
wmain+wchar_t* argv[])需另用std::wstring,与 ANSI 版本不兼容
-f file.txt
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










