我最近注意到,在给出以双破折号开头的参数时,我编写了一些程序(使用libgetopt)段错误--help
。
我设法通过以下小程序重现了这个:
#include <getopt.h>
int main(int argc, char *argv[]) {
// Parse arguments.
struct option long_options[] = {
{ "test", required_argument, 0, 't' }
};
int option_index, arg;
while((arg = getopt_long(argc, argv, "t:", long_options, &option_index)) != -1);
return 0;
}
当我使用./a.out --help
编译并运行它时,它可以正常工作。但是一旦我使用-O3
编译它就会出现段错误。在OS X Mavericks(10.9)上使用Apple LLVM版本5.0(clang-500.2.79)观察到此行为。
我有什么办法可以解决这个问题,或者我将来不应该使用-O3
吗?
答案 0 :(得分:2)
来自getopt_long的手册页
The last element of the longopts array has to be filled with zeroes.
所以你需要的是另一条线
struct option long_options[] = {
{ "test", required_argument, 0, 't' },
{ 0 } // this line is new
};
我怀疑是这种情况,因为我查看了你的代码并问道,“getopt_long如何知道数组中有多少元素”。手册确认。