【问题标题】:simulating command-line arguments in run-time在运行时模拟命令行参数
【发布时间】:2016-07-19 22:20:29
【问题描述】:

我有一个库,当库被编译为独立的二进制文件时,它有自己的命令行参数解析机制,代码如下:

int main( int argc, char **argv )
{
  int result;

  argc = wool_init( argc, argv );
  ....
}

int wool_init( int argc, char **argv )
{

  us_elapsed();

  argc = decode_options( argc, argv );
  .....
}

现在我将这个库静态链接到另一个有自己的命令行解析机制和参数的库。我想在运行时用一些参数初始化第一个库,例如,我将这些参数传递如下以模仿命令行:

/* initializing wool run-time environment */
char **woolArg;
*woolArg[0] = "-p 3";
wool_init(1, woolArg);

但我收到以下错误。

:113:14: error: assignment makes integer from pointer without a cast [-Werror]
  *woolArg[0] = "-p 3";
              ^

有人可以帮忙吗?

【问题讨论】:

  • 没有投反对票,但这可能是因为您可以通过搜索该错误消息自己回答问题,这会在 StackOverflow 上产生大量相关问题来处理该问题。

标签: c command-line argv


【解决方案1】:

让我们把内存管理问题放在一边,这里的其他答案已经解决了这个问题。让我们解释一下错误信息。你的说法是:

*woolArg[0] = "-p 3";

有哪些类型?

  • woolArgchar **
  • *woolArgchar *
  • *woolArg[0]char
  • "-p 3" is a char[] 但衰减为 char *

因此,您的作业左侧需要char,但右侧提供char *。因此,您正在隐式地将指针转换为整数的警告/错误。

要解决这个问题,您需要摆脱间接:

woolArg[0] = "-p 3";

【讨论】:

    【解决方案2】:

    让我们数星星。

    char **woolArg;
    

    两颗星在声明中。

    woolArg[0]
    

    这会用掉一颗星。我们留下了char*

    *woolArg[0]
    

    这会消耗另一颗星。我们留下了char

    *woolArg[0] = "-p 3";
    

    作业右侧有一个char*charchar* 是两个非常不同的东西。你可以试试

    woolArg[0] = "-p 3";
    

    ... 除非它不起作用,因为woolArg 未初始化,因此您无法触摸woolArg[0]。但是,与其试图解决这个问题,不如只被困在下一个问题上,然后是下一个问题,然后学习简单而正确的形式:

    char* woolArg[] = { "library", "-p", "3", NULL };
    

    第一个字符串是任意的。如果可以访问,您可以在此处使用argv[0]

    【讨论】:

      【解决方案3】:
      woolArg = malloc(sizeof(char *) * 3/*number of args*/);
      
      woolArg[0] = /*program name*/;
      woolArg[1] = "-p";
      woolArg[2] = "3";
      

      【讨论】:

      • 操作也忘记了woolArg的空间
      • 为什么是strdup?这对于字符串文字不是必需的(只要您不打算将数组迭代到 free 所有条目)。
      猜你喜欢
      • 2017-06-16
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2019-07-06
      • 1970-01-01
      • 2018-04-28
      相关资源
      最近更新 更多