【问题标题】:command line argument in c++ segmentation faultC ++分段错误中的命令行参数
【发布时间】:2014-03-22 20:56:30
【问题描述】:

我正在尝试在 c++ 中的 Linux(Ubuntu) 中使用命令行参数。但它会产生运行时错误:分段错误。这个程序在 Windows 中运行没有错误。这是我的代码

#include<iostream>
using namespace std;
int main(int argc , char **argv){
char **ss;
for(int i=0;i<argc;i++){
ss[i] = argv[i];

}
for(int i=0;i<argc ;i++)
cout<<ss[i];
return 0;
}

这段代码有什么问题。请帮我 。提前致谢。

【问题讨论】:

  • 请养成编译所有警告和调试信息(即g++ -Wall -g)的习惯,并学习如何使用gdb调试器。

标签: c++ linux unix command-line command-line-arguments


【解决方案1】:

对 ss 使用以下声明

#include<iostream>
using namespace std;
int main(int argc , char **argv){
    char *ss[argc]; // <--allocate argc count of pointers
    for(int i=0;i<argc;i++){
        ss[i] = argv[i];
    }
    for(int i=0;i<argc ;i++)
        cout<<ss[i];

    return 0;
}

【讨论】:

  • 您的代码不符合 C++ 标准。 C++ 中没有 VLA。
【解决方案2】:

正如已经回答的那样,您没有为ss 分配任何内存。 由于您使用的是 c++ 而不是 c,因此您应该可以使用 c++ 标准库:

std::vector<std::string> ss;
ss.reserve(argc); // not necessary
for(int i=0;i<argc;i++)
    ss.push_back(argv[i]);

【讨论】:

  • +1,但还有一个更简单的选择:std::vector&lt;std::string&gt; ss(argv, argv + argc);
  • 对于没有 c 背景的 c++ 程序员来说可能不太可读,因此不熟悉指针运算,但确实非常简洁。当我需要在自己的代码中转换原始数组时,我会记住这一点。
【解决方案3】:

您的程序具有未定义的行为,因为您没有初始化指针 ss 并分配内存来复制 argv 指向的元素

char **ss;   // What value does it have?
for(int i=0;i<argc;i++){
ss[i] = argv[i];

你可以这样做

char **ss = new char *[argc];   
for(int i=0;i<argc;i++){
ss[i] = argv[i];

更好的方法是使用std::vector&lt;std::string&gt;。在这种情况下,您不仅可以复制指向参数的指针,还可以复制参数。例如

#include<iostream>
#include <vector>
#include <string>

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

   for ( const std::string &s : v ) std::cout << s << std::endl;

   return 0;
}

如果您的编译器不支持基于范围的 for 语句,那么您可以将其替换为

   for ( std::vector<std::string>::size_type i = 0; i < v.size(); i++ ) 
   { 
      std::cout << v[i] << std::endl;
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 2019-03-19
    相关资源
    最近更新 更多