2017-09-12 28 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; 
}