2014-02-21 34 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; 
    }