【问题标题】:Are char * argv[] arguments in main null terminated?主 null 中的 char * argv[] 参数是否终止?
【发布时间】:2012-06-16 17:21:25
【问题描述】:

所以我想知道命令行参数是否总是以空值结尾?谷歌似乎同意了,在 GCC 上编译表明情况确实如此,但我能保证这始终是真的吗?

int main(int argc, char** argv)
{
    char *p;

    for(int cnt=1; cnt < argc; ++cnt)
    {
        p = argv[cnt];
        printf("%d = [%s]\n", cnt, p);
    }
    return 0;
}

$ MyProgram -arg1 -arg2 -arg3
1 = -arg1
2 = -arg2
3 = -arg3

【问题讨论】:

  • 想一想:如果它们不被 NULL 终止会发生什么?
  • 想一想... char[] 和 char* 不会自动暗示 C 风格的字符串。显然,整个命令行字符串都是以 NULL 结尾的,但不必转换为在命令行上传递的每个单独的字符数组都以 NULL 结尾。对于 argv 来说,只需去除命令行上的空格并具有非空终止字符数组而不是 C 样式字符串就很容易了。
  • @LeviX - 如果字符数组不是 NULL 终止的,你怎么能检测到它们字符数组的结尾?
  • @shf301 啊,好吧,我明白你的意思了。字符* argv[]。如果它们不是空终止的,你怎么知道一个从哪里开始,另一个从二维数组开始。明白了,我站得更正了,现在这是有道理的。谢谢。
  • @LeviX 这是关于知道每个字符串在哪里结束并能够将其传递给每个其他需要 NUL 终止符的 C 函数。它与数组中的字符串无关。像char* argv[] 这样的数组不是二维数组;它是一个指针数组。 (当然在真正的二维数组中,每个字符串的长度必须相同,所以我们不需要终止符?)指向的对象不必彼此相邻。即:这里,不要求每个连续指针所指向的地址必须在 NUL 终止先前编号的参数之后的 1 个字节。

标签: c argv null-terminated


【解决方案1】:

是的。 argv 数组中的非空指针指向 C 字符串,根据定义,这些字符串是空终止的。

C 语言标准仅声明数组成员“应包含指向字符串的指针”(C99 §5.1.2.2.1/2)。字符串是“由第一个空字符终止并包括第一个空字符的连续字符序列”(C99 §7.1.1/1),也就是说,它们根据定义以空字符终止。

另外,argv[argc] 处的数组元素是一个空指针,所以数组本身在某种意义上也是“空终止的”。

【讨论】:

  • 如果 argv 为空终止,你能解释一下 argc 的使用吗?我们不能检测到不。通过遍历数组直到达到 '\0' 的参数.. ?
  • @Snehasish 是的,您可以从 argv 计算 argc。至于为什么main 有它的签名,我不确定。在我存在之前就是这样。
  • @Snehasish:只是为了好玩,我在 Retrocomputing S.E. 上问了这个问题。 -- 这是前 ANSI C 的保留:retrocomputing.stackexchange.com/questions/5179/…
  • 只有数组的最后一个元素是空指针,但是你可以有argc == 0(虽然它非常罕见并且需要仔细设置),这样参数列表中就没有字符串了。如果命令名不可用但有其他参数,标准规定argv[0]应为空字符串,而不是空指针。
【解决方案2】:

是的,参数总是以空字符结尾的字符串。

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 2017-03-11
    • 1970-01-01
    • 2020-05-19
    • 2017-05-29
    • 2021-02-05
    • 2011-08-14
    • 2012-05-27
    • 2010-10-21
    相关资源
    最近更新 更多