【发布时间】:2017-01-30 07:15:22
【问题描述】:
我知道命令行参数是字符数组,它们存储在堆栈中。但我想知道为每个参数分配的实际内存。例如假设我将目录名称“/tmp”作为命令行参数传递。这将存储在 argv[1] 中。但正如我测试的那样,允许在程序中将 argv[1] 更改为“/tmp/log/”(大小增加)。这怎么可能?
【问题讨论】:
-
“我知道”之后是未经证实的猜测。
-
"但是我测试过,允许在程序中将 argv[1] 更改为 "/tmp/log/"(大小增加)。"是的,C 标准允许您修改
argv指向的字符串(N1570,第 5.1.2.2.1 节,第 2 节,最后一个约束),但“增加它们的大小”可能是 UB。您应该假设可修改的char[]与以零结尾的字符串一样多。 -
如果您
argv[1] = "/tmp/log"),您并没有增加argv[1]指向的字符串的大小,而是用另一个指针替换了一个指针。我怀疑strcat(argv[1], "/log")是否会成功。 -
@techiek7 那会覆盖字符串,所以如果输入比原来的参数长,就会是UB。
-
我知道 SO 真的很喜欢给人们投反对票,但鉴于指定了一个平台,并且该平台是开源的,这个问题有一个可验证的答案。
标签: c++ linux command-line-arguments