为什么`optarg`不被覆盖?

时间:2018-08-24 15:56:58

标签: c getopt

我是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没有分配到同一地址?

2 个答案:

答案 0 :(得分:4)

来自GNU manuals

  

如果该选项具有参数,则getopt通过将其存储在变量optarg中来返回该参数。通常,您不需要复制optarg字符串,因为它是指向原始argv数组的指针,而不是指向可能会被覆盖的静态区域。

这就是为什么不需要复制或分配它的原因。 POSIX documentation要求optarg使用。

答案 1 :(得分:2)

optarg指向argv中的元素。如果可以保证argv不会消失或不受代码的任何其他部分影响,那么您应该很好。由于argv通常位于main的开头到程序的结尾,因此您可以安全地缓存这些指针。

但是将optarg的值视为const char*。也就是说,除了引用它或复制原始字符串外,不要尝试对此存储器做任何事情。尝试在指针上执行类似strcat的操作是不安全的。