You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

main函数严格合规定义能否包含const限定的argc与argv?

关于C标准中main函数参数可修改性的合规性问题

根据ISO/IEC 9899:1999标准§5.1.2.2.1第12页第2段规定:
参数argc、argv以及argv数组指向的字符串应可被程序修改,且在程序启动至终止期间保留其最后存储的值。
注:在ISO/IEC 9899:2018标准中,上述引用段落位于§5.1.2.2.1第11页第2段。

问题1:带const修饰的main函数定义是否不符合严格合规性?

以下是被质疑的main函数定义:

int main(const int argc, const char * const * const argv) { /* ... */ }

这个定义不符合C标准的严格合规性。标准明确要求argc、argv以及argv指向的字符串必须具备可修改性,而这里的const修饰完全剥夺了这些参数的修改权限:

  • const int argc让argc成为不可修改的整数;
  • const char * const * const argv让argv本身、它指向的指针数组、以及数组元素指向的字符串都不可修改。
    虽然部分编译器可能会接受这个定义,但从C标准的合规角度来说,它直接违反了上述条款的要求。

问题2:该要求是否仅针对避免调用main时因修改数据导致未定义行为?

示例调用代码如下:

const int argsno = 1;
char *args[] = { "progname" /* String literal */ , (char *)0 };
main((int) argsno, args);

标准的这条要求并非仅约束用户调用main的场景,它本质是规定程序启动时系统传递给main的参数必须具备可修改性。不过你给出的这个调用方式确实存在合规性问题:字符串字面量在C标准中属于不可修改的对象,而args数组的第一个元素指向了字符串字面量,这就违反了“argv数组指向的字符串应可被程序修改”的要求,会导致未定义行为。

内容的提问来源于stack exchange,提问作者Salubia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 20:24:53