据我了解,除非在本地范围中将其声明为char[]
,否则您无法确定C中字符串的长度。如果将其作为参数传递,则它是一个char *
指针,如果不使用strlen()
,您将无法知道长度。关于堆栈溢出的许多其他答案对此进行了描述,包括this answer to "How to get the string size in bytes?"。
但是有时字符串不是以null结尾的,如果不是,则在尝试查找字符串的结尾时,您可能最终会查找其他内存。在我自己的代码中,我应该始终传递字符串的长度,以使我确定它的长度,但是main()
的参数呢?
如果bash有一个bug并传递了一个被截断或不以null终止的字符串怎么办?或者,如果我的程序被非外壳程序调用,例如另一个程序没有最常见的外壳程序成熟,该怎么办?我的程序可以分段吗?我可以揭露argv
附近的任何东西的记忆吗?
答案 0 :(得分:4)
简单答案:否。
您必须考虑到main(int argv, char *argv[])
的参数始终有效。
答案 1 :(得分:3)
启动C程序的软件负责为argv
创建适当的内容:
Per C 2018 5.1.2.2.1 2,“如果 argc 的值大于零,则数组成员 argv [0] 到< “ strong> argv [argc-1] ”应包含指向字符串的指针,这些指针在程序启动之前由主机环境赋予实现定义的值。”
从7.1.1开始,“ 字符串是连续的字符序列,这些字符以第一个空字符结尾并包括第一个空字符。”
因此,根据argv
的C标准,合法指向非空终止的字节序列是不合法的。这是可能吗?是的,如果软件中存在错误,则可能。 bash中的错误不会导致这种情况,因为bash在整个操作系统中都可以正常工作,并且bash无法将参数传递给操作系统未处理的程序。其他用户模式程序也不会导致这种情况,因为它们必须以相同的方式在操作系统中工作。在调用main
之前,将需要代码中的错误来加载和执行程序,并且/或者启动该程序的C程序中的代码必须如此。
答案 2 :(得分:0)
否,argv是一个字符串数组,它会跳过您可能在字符串之间放置的任何空格,因此,您可能输入的任何输入都是有效的,但是显然您想在尝试使用输入之前先对其进行检查。