在C++中使用linux命令行的分段错误
问题描述:
当我运行命令行./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;
}
答
嗯....在第6行访问的argv [1]但你没有通过任何paraeters ......这样的argv [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;
}
如果'的argv [1]'不存在,程序会崩溃,因为你试图读取并不存在的价值。您需要至少使用一个参数来调用它,或者进行一些错误检查。例如:'./hello.out 5' 例如,如果(argc Carl
',则可以在尝试调用'atoi(n)'前将其放在行上: 使用atoi()永远不会有任何借口。 –
我们更倾向于使用术语“未定义的行为”来“崩溃”,因为它不会总是崩溃。它可能会以一种更安静,更阴险的方式搞砸,在没有人注意到它为时已晚之前。 – user4581301