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