c无法从optarg中分配值

时间:2014-07-26 17:39:38

标签: c gcc cygwin

我目前遇到的问题

好像我无法将optarg的值分配给另一个变量。

我从未遇到过如此奇怪的行为,我无法将值从一个变量赋值给另一个变量。

inner_config = optarg;

作业后的值:

optarg = 0x60003a9d5 "debug_config.conf" <char*>
inner_config  = 0x0 "" <char*>

请注意问题出在代码段的注释中。

代码段

static char* inner_config = NULL; // Global var
static char* inner_log = NULL; // Global var
static char* inner_tee = NULL; // Global var

char option_config[PIPE_BUF] = {0}; // Global var
char option_log[PIPE_BUF] = {0}; // Global var
char option_tee[PIPE_BUF] = {0}; // Global var

static struct option const program_longopts[] =
{
  {"sanity", no_argument, NULL, 's'},
  {"pause", no_argument, NULL, 'p'},
  {"debug", no_argument, NULL, 'd'},
  {"tee", required_argument, NULL, 't'},
  {"config", required_argument, NULL, 'c'},
  {"log", required_argument, NULL, 'l'},
  {GETOPT_HELP_OPTION_DECL},
  {GETOPT_VERSION_OPTION_DECL},
  {NULL, 0, NULL, 0}
};

int programcmd(int argc, char **argv)
{
  int i;
//double seconds = 0.0;
  bool ok = true;
  char c = 0;

  initialize_main (&argc, &argv);
  set_program_name (argv[0]);
  setlocale (LC_ALL, "");
  bindtextdomain (PACKAGE_NAME, LOCALEDIR);
  textdomain (PACKAGE_NAME);

  initialize_exit_failure (PROGRAM_FAILURE);

  atexit (close_stdout);

  copyof_argc = argc;
  copyof_argv = argv;

  while ((c = getopt_long (argc, argv, "spdt:c:l:", program_longopts, NULL)) != -1)
    {
      switch (c)
        {
        case 'c': {
            inner_config = optarg; // Printing the value of optarg shows the string value
// Assinging it to innerconfig fails, inner_config stays with a NULL address
            strncpy((char*)&option_config[0], inner_config, PIPE_BUF - 1);
        }break;
        case 'l': {
            inner_log = optarg; // Printing the value of optarg shows the string value
// Assinging it to inner_log fails, inner_config stays with a NULL address
        strncpy((char*)&option_log[0], inner_log, PIPE_BUF - 1);
        }break;
        case 't': {
            inner_tee = optarg;// Printing the value of optarg shows the string value
// Assinging it to option_tee fails, inner_config stays with a NULL address
            strncpy((char*)&option_tee[0], inner_tee, PIPE_BUF - 1);
        }break;

        case 's': {option_sanity = 1;}break;
        case 'd': {option_debug = 1;}break;
        case 'p': {option_pause = 1;}break;

        case_GETOPT_HELP_CHAR;
        case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
        default:
          program_usage (); break;
        }
    }

  if (!ok)
      program_usage (EXIT_FAILURE);

  return exit_status;
}
我尝试过的

虚拟代码也导致崩溃:

static char *
strncpy2(char *dest, const char *src, size_t n) // optarg is NULL here
{
    size_t i;
// BUG HERE : src (optarg) is turned to NULL address here,
// While having the current string address in the previous function.
   for (i = 0; i < n && src[i] != '\0'; i++)
        dest[i] = src[i];
    for ( ; i < n; i++)
        dest[i] = '\0';

   return dest;
}
// Part of the previous function from the segment above here : 
   case 'c': {
// optarg address is valid here : 
   strncpy2((char*)&option_config[0], optarg, PIPE_BUF - 1);

   }break;

我尝试了什么

  1. 阅读文档optarg / getopt_long家庭功能。
  2. 调试以及设置虚拟函数以模拟此类行为。
  3. 在google上搜索以及stackoverflow(大多数相关错误都与long_options的syntex以及case / switch处理有关,我认为这不是问题所在。)
  4. 我的环境: 编译器:gcc 4.8(cygwin) 运行时 - CYGWIN_NT-6.1 1.7.25 调试器:gdb

    *在旁注,如果有人可以指出导致此问题的原因,那么我可以尝试理解它,而不是盲目地用给定的答案解决它,那将是很棒的。

    解决了问题:这是一个版本不匹配的问题,而且我没有提供足够的信息,对不起。 当我开始我的项目时,使用了旧版本的cygwin,它没有完全支持GNU的getopt系列,所以我不得不使用GNU本身的兼容源。 那个,加上实际支持它的新版cygwin导致头文件和“兼容性”不正确的源代码不匹配,从项目中删除“兼容性”源文件修复它。

    问题本来可以使用以下链接中的指导原则解决,其中一条评论提到了这些指南。 https://stackoverflow.com/help/mcve

    非常感谢在评论部分提供帮助的所有人。

0 个答案:

没有答案