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

黄蚁

这是以下产品的原型execv

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文档execv(“原理”部分的一半),看起来第二个参数是一个char *const仅用于向后兼容数组:

包含有关argv[]envp[]为常数的声明以使将来的语言绑定作者可以清楚地知道这些对象是完全恒定的。不幸的是,第四栏无法使用...

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

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

约翰·布林格

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

好吧,是的,您已经知道可以进行投射了。

从execv的POSIX文档(在“基本原理”部分中半步看),似乎第二个参数是char * const数组,仅用于向后兼容:

我不会用这些术语来表达,但是,是的,所选签名具有兼容性。您所参考的部分说明C不能完全令人满意地表达constPOSIXexecv()提供参数所需-ness程度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字符串文字对应于typechar而不是type的数组const char,因此就C而言,这是完全合法的,即使实际上尝试修改这些字符串的内容可能会失败。

第三,现代C具有数组文字,因此您甚至可以执行以下操作:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法将char数组传递给函数

来自分类Dev

将char数组的数组传递给函数

来自分类Dev

将char指针数组传递给函数

来自分类Dev

将char数组的指针传递给函数

来自分类Dev

如何从C#将const char *传递给C函数?

来自分类Dev

GLSL:将char数组传递给片段着色器

来自分类Dev

将char指针数组传递给函数

来自分类Dev

C编程,将char数组传递给函数

来自分类Dev

将char数组传递给函数内的struct数组

来自分类Dev

我们可以为char *分配内存,但是将其作为const char *返回吗?

来自分类Dev

将char数组传递给函数C ++

来自分类Dev

我可以将char *数组而不是几个参数传递给函数吗?

来自分类Dev

将char数组传递给const char时,strptime引发分段错误*

来自分类Dev

将char数组传递给需要const std :: string参考的函数

来自分类Dev

我们可以将const char *分配给cpp中的字符串吗?

来自分类Dev

将句子传递给C ++中的char数组

来自分类Dev

将const Char *转换为Char数组

来自分类Dev

将char数组传递给函数

来自分类Dev

SWIG,我可以为从Java传递给C的char **赋值吗

来自分类Dev

C18将char数组传递给函数

来自分类Dev

将char数组的数组传递给函数

来自分类Dev

将char指针/数组传递给函数

来自分类Dev

将char数组传递给函数模板,以便gcc可以知道它是文字吗?

来自分类Dev

可以将非const char数组传递为const char数组吗?

来自分类Dev

将char数组传递给CUDA内核

来自分类Dev

将指针传递给char数组作为函数的参数-C

来自分类Dev

将char向量的vector传递给char **

来自分类Dev

将char数组从父级传递给子级

来自分类Dev

可以将字符串文字传递给采用 const char* 的函数吗?

Related 相关文章

热门标签

归档