2014-02-21 26 views
0

我想在C++中的Linux(Ubuntu)中使用命令行参数。但它生成运行时错误:分割fault.this程序没有错误运行在windows。这里是我的代码在C++分段错误中的命令行参数

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

什么是错的这个代码。请帮帮我 。提前致谢。

+2

请大家习惯用的所有警告和调试信息(即'G ++ -Wall编译-g')并学习如何使用'gdb'调试器。 –

回答

-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; 
} 
+1

您的代码不符合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]); 
+2

+1,但有一个更简单的替代方法:'std :: vector ss(argv,argv + argc);' – Angew

+0

对于没有c背景的C++程序员来说可能会有点不可读,因此不熟悉指针算术,但确实非常简洁。当我需要在自己的代码中转换原始数组时,我会记住这一点。 – user2079303

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