我对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()
没有分配到同一个地址? 最佳答案
从AA>
如果该选项有一个参数,getopt通过将其存储在变量optarg中来返回该参数。通常不需要复制optarg字符串,因为它是指向原始argv数组的指针,而不是指向可能被覆盖的静态区域。
这就是为什么它不需要复制或分配。GNU manuals对于optarg
需要这个。
关于c - 为什么`optarg`不被覆盖?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52007993/