繁体   English   中英

C ++分段错误中的命令行参数

[英]command line argument in c++ segmentation fault

我试图在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;
}

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

您的程序具有未定义的行为,因为您没有初始化指针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<std::string> 在这种情况下,您不仅可以复制指向参数的指针,还可以复制参数。 例如

#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;
   }

如前所述,您尚未为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]);

将以下声明用于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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM