【问题标题】:cannot convert 'const char **' to 'const char*'无法将 'const char **' 转换为 'const char*'
【发布时间】:2015-08-26 14:39:45
【问题描述】:

大家早上好!我正在尝试通过传递的“-e”参数(例如 parent -e child key1=val1 ...)从父程序创建一个 fork/exec 调用。因此,我想将 argv 数组中前两个之后的所有值复制到一个新数组 child_argv 中。比如:

const char *child_argv[10];  // this is actually a global variable
static const char *sExecute;

      int I = 0;
const char *Value = argv[1];
    sExecute = Value;

      for (i=2; i<argc; i++) {
             child_argv[I] = argv[i];
             I++;
      }
    child_argv[I] = NULL;   // terminate the last array index with NULL

这样我可以通过以下方式调用 exec 端:

execl(sExecute, child_argv);

但是我收到错误消息“错误:无法将参数 '2' 的 'const char**' 转换为 'const char*' 到 'execl(const char*, const char*, ...)'”。我什至尝试过使用中间步骤:

const char *child_argv[10];  // this is actually a global variable
static const char *sExecute;

      int I = 0;
const char *Value = argv[1];
    sExecute = Value;

      for (i=2; i<argc; i++) {
    const char *Value = argv[i+1];
             child_argv[I] = Value;
             I++;
      }
    child_argv[I] = NULL;   // terminate the last array index with NULL

但我想不通。任何帮助将不胜感激!

更新

正如所指出的,在这种情况下,我应该使用“execv”而不是“execl”。但仍然出现错误...

更新 2

我最终复制了没有 argv 所需参数的数组。在此处查看帖子以查看结果How to copy portions of an array into another array

【问题讨论】:

  • 您的代码不包含 execl 调用,这是编译错误的来源。但就像错误所暗示的那样,当它需要const char* 时,您正在传递child_argvconst char** 类型)。
  • 我推荐你阅读the execl manual page,错误的原因应该很明显了。实际上,如果您阅读错误信息,您也会明白其中的原因。
  • @Barry 'execl' 调用已包含在帖子中。当 child_argv 创建为 const char* 数组时,我如何传递 const char**?

标签: c++ arrays char


【解决方案1】:

从这里:http://linux.die.net/man/3/exec

我认为您的意思是调用“execv”而不是“execl”。 Execl 似乎接受可变数量的参数,期望每个 const char * 是另一个参数,而 execv 接受一个参数数组。

【讨论】:

  • 欧普斯,回头看参考资料,你是对的!我更新为使用 'execv',但现在我收到错误“错误:从 'const char**' 到 'char* const*' [-fpermissive] 的无效转换”
  • 我猜你可能想读这个 stackoverflow.com/questions/7914444/…,但听起来你需要将 const char *child_argv[10]; 更改为 const char * const child_argv[10]; 或类似的东西。
  • @user 关键是 execl 期望传递一个常量字符串数组。当您将类型设置为const char *child_argv[10] 时,即为非常量字符串的常量数组。因此,您需要将其设为常量字符串数组(以多种方式)以使警告消失。
  • @Beck 我已经尝试了几件事,但无法弄清楚。 C++ 不是我选择的编程语言...还有其他想法吗?
  • 真的,您只需要点击上面的链接并仔细阅读该问题的答案即可。或者,发布一个关于此的新问题。 (但很可能它会被标记为重复。)如果您真的只想点击它并继续前进,您可以使用const_cast 来获取正确的常量。不过,这对于 C++ 程序员来说会很丑陋。
【解决方案2】:

您应该使用 execv。当您转换为 execv 时,由于某种原因 execv 需要一个非常量指针数组而不是 const 指针,因此您要么只需将数组转换为 (char**) 或将字符串复制到 (char*) 指针中。

【讨论】:

  • 感谢粉红恐怖的帮助!我以为我正在使用“Value”变量将字符串复制到上面列出的第二个示例中的(char *)指针中......显然不是......有什么想法吗?
  • 您的 child_argv 是 const char* 的数组。 execv 有一个 (char*) 数组作为其预期参数(我不知道为什么,但确实如此。)对于 C 类型,我可能会简化一点,但您从右到左阅读。因此,const char* child_argv[10] 是一个 10 元素数组,由指向 const 字符的指针组成。 execv 有这个作为它的第二个参数:char *const argv[] 所以,这是一个指向字符的 const 指针数组。它承诺不会修改指针本身,但它们指向的字符是公平的游戏。
  • 感谢您的帮助!那么你是说我需要将“const char* child_argv[10]”更改为“char *const argv[]”吗?对此感到抱歉...如前所述,我已经为此工作了两天,我很累,我很沮丧,而且这个问题在多个方面阻碍了开发。
  • 再次感谢您的帮助,我最终从不同的方向着手,并更新了帖子以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多