【问题标题】:Copy argv into new array将 argv 复制到新数组中
【发布时间】:2014-02-12 18:07:43
【问题描述】:

以下代码出现分段错误。有人可以解释为什么吗?我希望能够将 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,并从那里动态分配大小。

【问题讨论】:

  • char** rArray 没有为你分配任何内存,j &lt; argc 不是正确的条件。
  • @minitech 从技术上讲,char** rArray; 确实分配了堆栈空间(足以容纳一个指针)。
  • @FrerichRaabe:是的,因为那个我“完全”拿出了 =P

标签: c++ segmentation-fault argv


【解决方案1】:

你需要为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&lt;=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;

【讨论】:

  • 这不会复制字符串本身,是吗?我想这可能是提问者的意图。反正是&lt;,不是&lt;=,对吧?
  • @minitech 我注意到字符串不会(也不需要)被复制。 &lt;= 是故意的 - 我会编辑解释原因
  • 是的,argv[argc] 保证为NULL,但rArray[argc] 也保证超出范围……
  • @Michele 在第一个代码示例之后立即查看文本。 &lt;= 有意复制指向传递的最终参数的指针(恰好总是 NULL
  • 不应该 strlen(argv[i] + 1)strlen(argv[i]) + 1
【解决方案2】:

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

#include <string>
#include <vector>

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

【讨论】:

  • +1 - 一个更好的解决方案。如果您包含有关当前代码导致崩溃的问题的注释,我将删除我的答案。
  • @simonc,啊,你的意思是问题中的“当前代码”!好的,我一直在拼命地试图找出 C++ 是如何试图在这个 answer 的看似无辜的代码中再次杀死我们所有人的。 :)
【解决方案3】:

一件事是你没有初始化i

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

第二件事是rArray没有分配

我建议使用std::vector&lt;std::string&gt;,并将所有参数复制到向量,您无需担心分配/释放内存。

【讨论】:

    猜你喜欢
    • 2014-12-27
    • 2013-03-21
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2020-10-17
    • 1970-01-01
    相关资源
    最近更新 更多