在此之前,我为这个问题的无用标题道歉,但似乎没有更合适的。
这里的想法是复制 argv
到另一个变量中,实质上是创建一个副本。因此,函数的基本思路是使用 malloc()
来请求一些空间进行复制,然后遍历 argv
并复制每个元素。
这是我正在使用的代码,目前的开发环境是 Visual Studio 2019(即使它不是严格的 C 编译器...):
// Returns a copy of an array of strings (intended for argv, but should work with any of them):
wchar_t** copyArgv(size_t argc, wchar_t* argv[]) {
// Allocate space for the array of arguments:
wchar_t** argsCopy = malloc(((argc + 1) * sizeof(wchar_t*)));
if (!argsCopy)
return NULL;
// Copy each one of them:
for (size_t i = 0; i < argc; i++) {
argsCopy[i] = _wcsdup(argv[i]);
if (!argsCopy[i]) {
// Should also free any previous copied string I left that part out in the paste.
free(argsCopy);
return NULL;
}
}
argsCopy[argc] = NULL;
return argsCopy;
}
我一直在尝试不同的方法来复制argv,但每一种方法都让VS认为在复制参数时可能会发生缓冲区溢出(行:argsCopy[i] = _wcsdup(argv[i]);
),或者在下一行读取无效数据,也就是读取超出保留空间的边界。
这一切都让我相信问题出在(现在)仅有的malloc()
调用上,用于为参数数组保留空间。
然而,我一直在努力找出问题所在,我是说,我认为我正在请求足够的空间。
我也尝试了其他编译器,最新稳定版本的Clang和GCC似乎没有显示任何此类警告。因此,我决定向您这些经验丰富的程序员请教,看看您是否能发现问题,或者它是某种编译器错误(我不太可能)。
对于参考,这些是VS2019在64位编译中引发的确切警告:
在赋值操作中:
写入'argsCopy'时的缓冲区溢出:可写大小为“((argc+1))*sizeof(wchar_t *)”字节,但可能写入“16”个字节。
下一行,对NULL的测试:
从'argsCopy'中读取无效数据:可读大小为“((argc+1))*sizeof(wchar_t *)”字节,但可能读取“16”个字节。
argsCopy[argc] = NULL
。 - gudok