在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 }; 

因为这将确保数组确实足够长以获得空终止(如果数组太短,编译器将生成诊断消息)。