重新分配argv

时间:2015-08-15 16:29:41

标签: c main argv

当我在main函数(第78行)中看到这段代码时,我正在查看GNU coreutils包的代码,特别是the program 'yes'

if (argc <= optind)
{
  optind = argc;
  argv[argc++] = bad_cast ("y");
}

如何以这种方式扩展数组argv?显然,只是将任何代码片段脱离上下文是一个非常糟糕的主意,所以我先看看argv是否完全被修改,除了调用{{1}之外似乎没有看起来似乎不需要为“新大小”或类似的东西进行论证(但在C语言中,就像任何语言一样,事情并不总是它们看起来如此)。

我决定编写一个简单的程序来测试我是否可以在initialize_main (&argc, &argv)上调用realloc()

argv

它有效(在Windows 10上使用VS2013)。它返回了指向已分配内存的指针。当然,如果它是未定义的行为,那实际上并不意味着任何

所以,长话短说,我的问题是,如何分配char** new_argv = realloc(argv, ++argc * sizeof*argv); ?重新分配argv是否真的安全?

1 个答案:

答案 0 :(得分:5)

首先,argv[argc]定义为NULL

其次,argc++递增argc但返回其旧值。

因此,argv[argc++] = ...不会调用未定义的行为;它只是为以前的NULL指针赋予一个新值。