假设我们有一项任务要编写一个添加2个数字的函数。
#include <stdio.h>
int main(int argc, char ** av) {
int a = atoi(av[1]);
int b = atoi(av[2]);
add_and_print(a, b)
return 0;
}
它工作良好,直到我通过以下代码:
./a.out
只是传递空字符串。然后它写下以下内容:
1495 segmentation fault (core dumped)
你能解释一下问题出在哪里吗?我该怎么处理?
argc
包含提供给程序的参数数量,如果不检查它,则可能会在尝试从argv
读取时出现segfault。如果没有足够的参数,您可以显示错误消息并退出:
if (argc < 3) {
puts("Please provide 2 numbers as command line arguments.");
return 1;
}
如何处理segfault
segfault的发生是因为代码中的一个错误。
因此,通过不编写有缺陷的代码,您可以从一开始就防止这种情况的发生。
不过,一般来说,segfault可以很容易地找出到底是什么错误触发了它:只需在调试器下运行程序,它就会在segfault发生的地方停止。
你能解释一下的问题吗
在此代码中:
int a = atoi(av[1]);
表达式CCD_ 3只有在数组CCD_。如果只有一个元素,则此代码将尝试读取超出数组末尾的内容。
由于数组基于命令行参数,您必须检查。您需要对来自用户、文件甚至您自己代码的其他部分的所有输入执行此操作。不要只是假设用户做了你所期望的事情(或者文件包含了你所期待的,或者调用者传递了正确的值(。这是一个bug。
if (argc >= 2) {
// now it is safe to refer to av[1]
a = atoi(av[1]);
}
出于同样的原因,您必须对av[2]
执行类似的操作。
一个常见的解决方案可能是
int main(int argc, char **argv) {
if (argc < 3) {
printf("Syntax: %s a bn"
"n"
"Two integer arguments are required.", argv[0]);
return -1;
}
int a = atoi(argv[1]);
int b = atoi(argv[2]);
add_and_print(a, b)
}
我只是假设argc
至少是1,而argv[0]
是程序的名称。如果您想要完全可移植的代码,也可以检查此项。
请注意,您可能还想检查参数是否真的是整数。