【问题标题】:Values in between brackets in function definitions [duplicate]函数定义中括号之间的值[重复]
【发布时间】:2016-03-09 19:46:16
【问题描述】:

我以前见过有人用 C 做这样的事情 -

int main (int argc, char *argv[argc+1])
{
    /* ... */
}

argc+1 的意义是什么?它是什么意思?它是否有助于防止无效指针或什么?

【问题讨论】:

  • 不能说我见过char *argv[argc+1]) - 任何参考
  • 没有任何意义,因为编译器会忽略它。
  • 我找到了。它出现在 Hacker News - news.ycombinator.com/item?id=9019085 上。 " 据称这有助于防止传入空指针,并可能告诉分析器和优化器一些他们应该知道的事情。"
  • “据称这有助于防止传入空指针” 相反,C 规范保证 argv[argc] 空指针.因此,如果编译器以某种方式强制执行非 NULL 规则(实际上没有),那么 main 的定义将无效。
  • 正如被骗者(简要地)描述的那样,如果数组语法用于函数参数带有关键字static(仅限C99或更高版本),而这个Q没有,它告诉编译器/等调整后的参数必须至少指向那么多元素,因此必须是非空的;它不需要关于元素值的任何内容,这里是指针 in argv[i]。正如@user3386109 表明其他地方的标准要求argv[0 to argc] 在初始调用2arg 时main 存在,[argc] 是空指针,[0..argc-1] 指向字符串值(必须非空)。跨度>

标签: c


【解决方案1】:

一方面,这在“经典”C (C89/90) 中是不允许的,因为数组大小表达式不是恒定的。它在 C99 中变得合法。

另一方面,即使在 C99 中,函数参数声明中的顶级数组大小仍然被忽略,声明等效于

int main (int argc, char **argv) 

所以,argc+1 存在的唯一原因是作为自文档功能:它告诉读者argv 指针指向具有argc + 1 有效元素的数组的开头。

【讨论】:

  • 啊,谢谢!不幸的是,由于许多其他人(和我自己)将此标记为重复,我的问题已经有了答案:P 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 2018-09-28
  • 2014-11-26
  • 2018-10-14
  • 2012-12-15
相关资源
最近更新 更多