为什么 `optarg` 不会被覆盖?

Why does `optarg` not get overwritten?

我是 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

这项工作是否始终如一,还是我应该始终如此 copy/duplicate?
我是否必须处理 free()ing optarg 中返回的所有内容?
我只是运气好,optargrealloc() 没有分配到同一个地址吗?

optarg 指向 argv 中的一个元素。如果您可以保证 argv 不会消失或被代码的任何其他部分触及,那么您应该很好。由于 argv 通常从 main 开始到程序结束,您可以安全地缓存这些指针。

但将 optarg 值视为 const char*。也就是说,除了引用它或复制原始字符串之外,不要尝试对该内存做任何事情。尝试在指针上做类似 strcat 的事情充其量是不安全的。

来自GNU manuals

If the option has an argument, getopt returns the argument by storing it in the variable optarg. You don’t ordinarily need to copy the optarg string, since it is a pointer into the original argv array, not into a static area that might be overwritten.

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

需要这个