答案 0 :(得分:9)
在您的代码中,更改
for (int i=0; argc; i++){
到
for (int i=0; i < argc; i++){
否则,显然没有对for
循环进行条件检查(argc
将>= 1
并且通常不变),将其转换为< em>无限循环。
FWIW,此i
的未绑定增量会导致testArray[i]
访问导致undefined behaviour的超出内存。
那就是说,还有更多的事要让你烦恼。没有什么叫做c和c ++代码。它们是非常不同的,应该是这样的。请不要混淆它们。他们每个人都有自己的优点/缺点,使用适合你的,但不能同时使用代码。
现在,关于数组的复制,argv
是指向argv[i]
的指针,它包含命令行参数。 *argv[i]
不会一次提供整个数组,它只指向argv[i]
数组中的第一个元素。所以,
testArray[i] = *argv[i];
不会复制数组。要复制它,
strlen(argv[i]) + 1
strcpy()
将argv[i]
复制到缓冲区。您需要使用std::copy()
。
答案 1 :(得分:1)
之前的答案是正确的,但是,您的代码中还有另一个错误。 char testArray[argc]
实际上不是一个字符串数组,而是一个字符数组(也就是一个字符串)。所以你在这里做什么
testArray[i] = *argv[i];
有效,但它只将每个参数的第一个字符复制到testArray
。我认为这不是你想要的。
要理解这一点,您必须了解指针的工作原理。 char** argv
是一个双指针。这意味着它指向argc
指针列表。因此,如果您的程序有两个参数,那么您的argv将指向内存中存在三个指针列表的位置。这三个指针分别指向存储器中存储相应参数的某个位置。要了解指针,最简单的方法是在youtube上搜索pointers c
。
因此,要复制它们,您应该使用strcpy。
或者您只能复制指针。
char* myArgv[argc];
myArgv[0]=argv[0];
myArgv[1]=argv[1];
//etc until argc
这样可行,但你不会自己复制参数,只是指向它们的指针。