【发布时间】:2017-09-12 21:46:46
【问题描述】:
当我运行命令行 ./hello.out 时,内核被转储。谁能告诉我我错过了什么。
#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;
}
【问题讨论】:
-
如果
argv[1]不存在,程序将崩溃,因为您试图读取一个不存在的值。您需要使用至少一个参数调用它,或者进行一些错误检查。例如:./hello.out 5例如,您可以在尝试调用atoi(n)之前将其放在线路上:if (argc < 2) return -1; -
而且从来没有任何借口可以使用 atoi()。
-
我们更喜欢术语“未定义的行为”而不是“崩溃”,因为它不会总是崩溃。它可能会以一种更安静、更阴险的方式搞砸,在为时已晚之前没人注意到。
-
抱歉,未定义的行为在这里当然是合适的术语。谢谢!
-
“我错过了什么?” - 了解what the arguments to
main()mean,以及如何使用它们。