将argv复制到新数组中

时间:2014-02-12 18:07:43

标签: c++ segmentation-fault argv

我收到以下代码的分段错误。有人可以解释一下原因吗?我希望能够将argv的内容复制到一个新的数组中,我称之为rArray。

#include <iostream>        
using namespace std;

int main( int argc, char **argv)
{
  char **rArray;
  int numRows = argc;
  cout << "You have " << argc << " arguments:" << endl << endl;
  cout << "ARGV ARRAY" << endl;
  for (int i = 0; i < argc; i++)
  { 
    cout << argv[i] << endl;
  }
  cout << endl << endl << "COPIED ARRAY" << endl;
  for(int i; i < numRows; i++)
  {
    for (int j = 0; j < argc; j++)
      {
        rArray[i][j] = argv[i][j];
      }
  }
  for (int i = 0; i < argc; i++)
  {
    cout << "Copied array at index " << i << "is equal to " << rArray[i] << endl;;
  }
  cin.get();
}

程序输出:

/a.out hello world
You have 3 arguments:

ARGV ARRAY
./a.out
hello
world


COPIED ARRAY
Segmentation fault: 11

为什么我收到此错误?我该如何解决?

编辑:我得到了修正,将char **rArray更改为string rArray,并从那里动态分配大小。

3 个答案:

答案 0 :(得分:10)

您需要为rArray分配内存,并且还需要初始化外循环计数器i

由于argv的内容是常量字符串,您只需将指针复制到它们

即可
rArray = new char*[argc+1];
for(int i=0; i <= argc; i++) {
    rArray[i] = argv[i];
}
// use rArray
delete [] rArray;

请注意,argv[argc]保证为NULL。我已经更新了循环以复制它(因此看起来不寻常的i<=argc退出条件)

如果你真的想要复制字符串的内容(正如minitech建议的那样),代码会变得有点复杂:

rArray = new char*[argc+1];
for(int i=0; i < argc; i++) {
    int len = strlen(argv[i]) + 1;
    rArray[i] = new char[len];
    strcpy(rArray[i], argv[i]);
}
rArray[argc] = NULL;
// use rArray
for(int i=0; i < argc; i++) {
    delete [] rArray[i];
}
delete [] rArray;

答案 1 :(得分:9)

其他人指出了你的代码的各种问题;如果您实际想要复制argv,请使用std::vectorstd::string个对象:

#include <string>
#include <vector>

int main( int argc, char **argv ) {
    std::vector<std::string> args( argv, argv + argc );
}

答案 2 :(得分:3)

有一点是你没有初始化i

for(int i; i < numRows; i++)
        ^-- !

第二件事是rArray未分配

我建议使用std::vector<std::string>,并将所有参数复制到vector,您不必担心分配/释放内存。