我目前遇到的问题:
好像我无法将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;
我尝试了什么:
我的环境: 编译器:gcc 4.8(cygwin) 运行时 - CYGWIN_NT-6.1 1.7.25 调试器:gdb
*在旁注,如果有人可以指出导致此问题的原因,那么我可以尝试理解它,而不是盲目地用给定的答案解决它,那将是很棒的。
解决了问题:这是一个版本不匹配的问题,而且我没有提供足够的信息,对不起。 当我开始我的项目时,使用了旧版本的cygwin,它没有完全支持GNU的getopt系列,所以我不得不使用GNU本身的兼容源。 那个,加上实际支持它的新版cygwin导致头文件和“兼容性”不正确的源代码不匹配,从项目中删除“兼容性”源文件修复它。
问题本来可以使用以下链接中的指导原则解决,其中一条评论提到了这些指南。 https://stackoverflow.com/help/mcve
非常感谢在评论部分提供帮助的所有人。