在 运行 时间内模拟命令行参数

simulating command-line arguments in run-time

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

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";
              ^

有人可以帮忙吗?

woolArg = malloc(sizeof(char *) * 3/*number of args*/);

woolArg[0] = /*program name*/;
woolArg[1] = "-p";
woolArg[2] = "3";

让我们数星星。

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]

先把内存管理问题放在一边吧,这里的其他答案已经解决了。让我们解释一下错误消息。您的陈述是:

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

有哪些类型?

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

因此,您的作业左侧需要 char,但右侧提供 char *。因此 warning/error 您隐式地将指针转换为整数。

要解决此问题,您需要摆脱间接寻址:

woolArg[0] = "-p 3";