在C中初始化以NULL结尾的字符串数组的正确方法
这段代码是否正确?
char *argv[] = { "foo", "bar", NULL };
它在语法上是正确的,它确实创建了一个以NULL结尾的字符串数组。
argv作为char*[]
(或等效地, char**
)传递给main
,但将字符串文字视为const char*
而不是char*
是“更正确的”。 因此,对于这个特定的例子,你需要const char *argv[] = {"foo", "bar", NULL };
也许你真的不会用“foo”初始化它,但实际上你需要通过argv修改一个可修改的字符串。 在那种情况下, char*[]
是对的。 这就是Charles可能的意思,即代码是否“正确”取决于你用它做什么。
声明或初始化没有明显的错误,但它是否“正确”取决于代码的其余部分实际上对argv
做了什么。
是的,你的代码正式是正确的(参见史蒂夫关于const
的评论)。 它将生成一个以char *
类型的空指针终止的数组。
你也可以这样做
char *argv[4] = { "foo", "bar" };
要么
char *argv[10] = { "foo", "bar" };
如果您的arrays由于某种原因必须具有特定的大小。 在这种情况下,额外的元素也将被设置为空指针,即使您没有显式初始化它们。 但我会说,即使在这种情况下,最好使用它
char *argv[4] = { "foo", "bar", NULL };
因为这将确保数组确实足够长以获得空终止(如果数组太短,编译器将生成诊断消息)。