c - argv[0] 什么时候可以为空?

标签 c argv

我对从命令行向 main() 传递参数的理解是 argc 的最小值为 1,而 argv[0] 将始终包含程序名称及其路径。

如果在命令行中提供了参数,那么 argc 的值将大于 1,而 argv 1 argv[argc-1] 将具有这些参数。

现在是 this link 的一段说

argv[0] will be a string containing the program's name or a null string if that is not available.

现在,argv[0] 如何以及何时可以有空字符串?我的意思是程序名称及其路径将始终可用,所以什么时候可以为空?

作者说“如果那不可用”但是程序名称何时以及如何可能不可用?

最佳答案

使用 exec 调用类,您可以分别指定程序 name 和程序 executable ,这样您就可以将其设置为 NULL。

但这句话实际上来自 ISO 标准(可能是转述的),并且该标准涵盖了从最小的微 Controller 到最新的 z10 企业级大型机的范围极广的执行环境。

许多嵌入式系统都处于可执行名称毫无意义的情况。

来自最新的c1x草案:

The value of argc shall be nonnegative.

The value argv[argc] shall be a null pointer.

If the value of argc is greater than zero, the array members argv[0] through argv[argc-1] inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program start up.

这意味着,如果 argc 为零(并且可以为零),则 argv[0] 为 NULL。

但是,即使 argc 不是 0,您也可能无法获得程序名称,因为标准还规定:

If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. If the value of argc is greater than one, the strings pointed to by argv[1] through argv[argc-1] represent the program parameters.

因此,标准没有要求提供程序名称。我见过程序为此值使用多种选项:

  • 完全没有值(value)(为了假定的安全性)。
  • 一个公然的谎言(例如对一段恶意代码的 sleep)。
  • 实际的程序名称(例如sleep)。
  • 稍作修改(例如用于登录 shell 的 -ksh)。
  • 描述性名称(例如,progname - a program for something)。

关于c - argv[0] 什么时候可以为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2794150/

相关文章:

c - 使用 scanf 进行入栈操作

c++ - 是否有用于在 XP 的双 View 或克隆桌面设置之间切换的 c/c++ 多显示器库?

c - 如何将 2 个 32 位整数相乘产生一个 64 位整数?

php - $argv 在一个类中

C - 在数组中存储 main() 参数

python - 将列表列表从 Python 传递到 C 作为 uint64_t 矩阵

c - 在程序执行期间编辑源代码

c - 处理字符串的链表,C

c - 无法从 CodeGolf 理解这段代码

f# - Microsoft.FSharp.Text.ArgParser 在哪里?