test1.c
int main(void)
{
int input = 0;
printf("Input a int number: \n");
scanf("%d", input);
printf("input = %d \n", input);
return 0;
}
上述程序运行会发生段错误,原因在于 scanf("%d", input); 出错. 正常情况,我们都是如是写: scanf("%d", &input); 那么,在不改变源程序的情况下,如何增加必要代码,避免段错误?
下面的程序给出解决方案:
test2.c
#include <stdio.h>
int main(int argc, char **argv)
{
if (argc < 2)
{
printf("Run: ./test 0/1/2 \n");
exit(1);
}
int i = atoi(argv[1]);
printf("i = %d \n", i);
if(0 == i)
{
int input = 0;
printf("Input a int number: \n");
scanf("%d", input);
printf("input = %d \n", input);
}
else if(1 == i)
{
int input = 0;
int inputArds = 0;
input = &inputArds;
printf("Input a int number: \n");
scanf("%d", input);
printf("input = 0x%x, inputArds = %d\n", input, inputArds);
}
else if(2 == i)
{
int input = 0;
int inputArds = 0;
input = &inputArds;
printf("Input a int number: \n");
scanf("%d", &inputArds);
printf("input = %d \n", inputArds);
}
return 0;
}
i 等于 0 即是 test1.c的情况.发生段错误.
i 等于 1即是修改后的情况,不会发生段错误.
i等于2是正常写法.
运行结果:
#./inputTest
Run: ./test 0/1/2
# ./inputTest 1
i = 1
Input a int number:
32
input = 0x7fcb07b8, inputArds = 32
# ./inputTest 0
i = 0
Input a int number:
3232
Segmentation fault
# ./inputTest 2
i = 2
Input a int number:
343
input = 343