【发布时间】:2015-11-08 16:45:03
【问题描述】:
当我在 main 函数(第 78 行)中看到这段代码时,我正在查看 GNU coreutils 包的代码,特别是 the program 'yes':
if (argc <= optind)
{
optind = argc;
argv[argc++] = bad_cast ("y");
}
数组argv怎么可以这样展开呢?显然,将任何代码 sn-p 脱离上下文是一个非常糟糕的主意,所以我查看了 argv 是否事先被修改过,除了对 initialize_main (&argc, &argv) 的调用之外似乎没有,这似乎不需要为“新大小”或类似的东西争论(但在 C 中,就像任何语言一样,事情并不总是它们看起来的样子)。
我决定写一个简单的程序来测试我是否可以在argv上调用realloc()
char** new_argv = realloc(argv, ++argc * sizeof*argv);
它有效(在 Windows 10 上使用 VS2013)。它返回一个指向已分配内存的指针。当然,如果它是未定义的行为,那实际上并不意味着 任何东西。
所以,长话短说,我的问题是,argv 是如何分配的?重新分配argv真的安全吗?
【问题讨论】:
-
我很确定它是未指定的,因此是 UB;你最好 malloc + memcpy。考虑一下 coreutils 是为特定平台编写的,其中一些行为是已知的。
-
argv是指向char(程序拥有)的指针数组,最后一个,即argv[argc]应该是空指针,所以可以让它指向到别的东西。