我对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()中返回的所有内容吗?
我是不是运气好,而且optargrealloc()没有分配到同一个地址?

最佳答案

从AA>
如果该选项有一个参数,getopt通过将其存储在变量optarg中来返回该参数。通常不需要复制optarg字符串,因为它是指向原始argv数组的指针,而不是指向可能被覆盖的静态区域。
这就是为什么它不需要复制或分配。GNU manuals对于optarg需要这个。

关于c - 为什么`optarg`不被覆盖?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52007993/

10-10 11:24