当我在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
是否真的安全?
答案 0 :(得分:5)
首先,argv[argc]
定义为NULL
。
其次,argc++
递增argc
但返回其旧值。
因此,argv[argc++] = ...
不会调用未定义的行为;它只是为以前的NULL
指针赋予一个新值。