2017-09-12 27 views
-4

當我運行命令行./hello.out時,核心被轉儲。有人能告訴我我錯過了什麼嗎?在C++中使用linux命令行的分段錯誤

#include <iostream> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
int counter = 1, sum = 0,x; 
x= atoi(argv[1]); 
if (x<0) 
{cout << "Error\n"; exit(1);} 
if (argc !=2) 
{cout << "Error\n"; exit(1);} 

while (counter <= x) 
    { 
      cout << counter << endl; 
      sum = sum + counter; 
      ++counter; 
    } 
cout << "Sum is " << sum << endl; 

return 0; 
} 
+2

如果'的argv [1]'不存在,程序會崩潰,因爲你試圖讀取並不存在的價值。您需要至少使用一個參數來調用它,或者進行一些錯誤檢查。例如:'./hello.out 5' 例如,如果(argc <2)返回-1;' – Carl

+0

',則可以在嘗試調用'atoi(n)'前將其放在行上: 使用atoi()永遠不會有任何藉口。 –

+1

我們更傾向於使用術語「未定義的行爲」來「崩潰」,因爲它不會總是崩潰。它可能會以一種更安靜,更陰險的方式搞砸,在沒有人注意到它爲時已晚之前。 – user4581301

回答

0

嗯....在第6行訪問的argv [1]但你沒有通過任何paraeters ......這樣的argv [1]可以指向任何地方

1

看來,你想訪問元素argv不存在,因此您正在訪問您的程序無法控制的內存。當你這樣做時,內核會立即殺死你的程序。您正在檢查argc的值,這是正確的做法,但是您在訪問argv後正在執行此操作。您只需在訪問argv之前執行該檢查。

#include <iostream> 
using namespace std;  

int main(int argc, char *argv[]) 
{ 
    int counter = 1, sum = 0,x; 

    if (argc !=2) argv // <-- Make sure there are two elements before indexing into 
    { 
     cout << "Error\n"; 
     exit(1); 
    } 
    x = atoi(argv[1]); // <-- You should study and use 'std::stoi' instead 
    if (x < 0)  
    { 
     cout << "Error\n"; 
     exit(1); 
    } 

    while (counter <= x) 
    { 
     cout << counter << endl; 
     sum = sum + counter; 
     ++counter; 
    } 
    cout << "Sum is " << sum << endl; 

    return 0; 
}