我是getopt(3)
的新手,看了一些例子,发现this one。
这些行
case 'c':
cvalue = optarg;
break;
对我来说很奇怪,因为optarg的内容没有被复制到cvalue
中,它们只是在复制指针。但这有效:
$ testopt -a -b -c foo
aflag = 1, bflag = 1, cvalue = foo
我期望optarg
被第二次调用getopt()
覆盖,因此我根据示例编写了own program。令人惊讶的是,optarg
不会被覆盖。
$ testopt -p -f me -t you
pflag = 1, from = me, to = you
这项工作是否始终如一?我应该始终复制/复制吗?
我需要free()
处理optarg
中返回的所有内容吗?
我是否很幸运,realloc()
中的optarg
没有分配到同一地址?
答案 0 :(得分:4)
来自GNU manuals:
如果该选项具有参数,则getopt通过将其存储在变量optarg中来返回该参数。通常,您不需要复制optarg字符串,因为它是指向原始argv数组的指针,而不是指向可能会被覆盖的静态区域。
这就是为什么不需要复制或分配它的原因。 POSIX documentation要求optarg
使用。
答案 1 :(得分:2)
optarg
指向argv
中的元素。如果可以保证argv
不会消失或不受代码的任何其他部分影响,那么您应该很好。由于argv
通常位于main
的开头到程序的结尾,因此您可以安全地缓存这些指针。
但是将optarg
的值视为const char*
。也就是说,除了引用它或复制原始字符串外,不要尝试对此存储器做任何事情。尝试在指针上执行类似strcat
的操作是不安全的。