gpt4 book ai didi

我可以将 const char* 数组传递给 execv 吗?

转载 作者:太空狗 更新时间:2023-10-29 15:01:57 25 4
gpt4 key购买 nike

这是execv的原型(prototype):

int execv(const char *path, char *const argv[]);

我可以传递一个 const char 指针数组作为第二个参数吗?

当未设置 USE_CAST 时,此示例程序会发出警告:

#include <unistd.h>
int main(int argc, char *argv[])
{
if (argc > 0) {
const char *exe_name = "/bin/echo", *message = "You ran";
const char *exe_args[] = { exe_name, message, argv[0], NULL };
#ifdef USE_CAST
execv("/bin/echo", (char **) exe_args);
#else
execv("/bin/echo", exe_args);
#endif
}
return 0;
}

编译时,如果我不使用强制转换,gcc 会提示“从不兼容的指针类型传递‘execv’的参数 2”。

来自POSIX documentation对于 execv(基本原理部分的一半),看起来第二个参数是一个 char *const 数组,只是为了向后兼容:

The statement about argv[] and envp[] being constants is included to make explicit to future writers of language bindings that these objects are completely constant. ... It is unfortunate that the fourth column cannot be used...

其中“第四列”指的是 const char* const[]

(char **) 在这里使用是否安全?我应该创建一个 char * 数组并将其传递给 execv 吗?

最佳答案

Can I pass an array of const char pointers as the second argument?

是的,你已经知道你可以施法来做到这一点。

From the POSIX documentation for execv (halfway through the Rationale section), it looks like the second argument is a char *const array only for backwards compatibility:

我不会用那些术语来表达它,但是,是的,所选签名存在兼容性方面的问题。您引用的部分解释说,C 没有完全令人满意的方式来表达 POSIX 要求 execv() 为参数提供的 const 程度。 POSIX 保证该函数不会更改 argv 中的指针或它们指向的字符串。

在这种情况下,我认为按照您的建议转换 argv 指针并非不合理,尽管我会在我的代码中留下评论,解释为什么这样做是安全的。

另一方面,您应该考虑将 const 简单地从您的数组声明中删除:

char *exe_name = "echo", *message = "You ran";
char *exe_args[] = { exe_name, message, argv[0], NULL };

或者,在您的简单示例中,即使这样也可以:

char *exe_args[] = { "echo", message, argv[0], "You ran", NULL };

C 字符串文字对应于 char 类型的数组,而不是 const char,所以就 C 而言,这是完全合法的,即使实际上试图修改这些字符串的内容可能会失败。

另一方面,现代 C 有数组文字,所以你甚至可以这样做:

execv("/bin/echo", (char *[]) { "echo", "You ran ", argv[0], NULL });

在最后一种情况下,您甚至没有强制转换(类似于一个的东西只是数组文字语法的一部分)。

关于我可以将 const char* 数组传递给 execv 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com