为何C语言命令行参数要包含argc?能否通过sizeof计算argv长度?
关于C语言main函数中argc与argv的常见问题
为什么需要argc?
- 直接获取参数总数:argv是指向字符串指针的数组,虽然C标准规定
argv[argc]必须是NULL,但提前拿到argc可以直接知晓参数数量,无需循环遍历到NULL来计数,代码更简洁高效。 - 规避NULL终止的潜在风险:尽管标准保证argv末尾是NULL,但如果程序中不小心修改了argv的内容(比如误操作指针),可能导致遍历参数时出错。而argc是明确的数值,能可靠提供参数总数。
- 标准与历史约定:C语言早期就定义了main函数的这种参数形式,argc作为参数总数的直接传递是约定俗成的设计,也方便编译器和运行时环境传递参数信息。
能不能用sizeof(argv)/sizeof(char *)计算argv的大小?
绝对不行,核心原因是:
在main函数的参数列表里,argv看似是char *argv[](字符串指针数组),但数组作为函数参数时会自动退化为指针,也就是argv本质是char **类型。
此时sizeof(argv)得到的是指针本身的大小(32位系统为4字节,64位系统为8字节),sizeof(char *)同样是指针的大小,两者相除结果永远是1,完全不等于实际的参数数量。
比如你运行程序时传入3个参数,argc的值是4(包含程序名本身),但用sizeof(argv)/sizeof(char *)计算出来的结果还是1,根本无法得到正确的参数数量。
内容的提问来源于stack exchange,提问作者JobHunter69
相关产品推荐
相关产品推荐

