为什么 `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
中返回的所有内容?
我只是运气好,optarg
的 realloc()
没有分配到同一个地址吗?
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
.
需要这个
我是 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
中返回的所有内容?
我只是运气好,optarg
的 realloc()
没有分配到同一个地址吗?
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
.