随机播种段故障

时间:2013-11-22 05:26:40

标签: c debugging error-handling segmentation-fault

我被要求将随机播种放入用户键入-r时调用的程序中。它显示为看起来像

-r1234567

因此,作为全局变量,我设置Random = 1234567。

我也把它添加到我的函数顶部:

printf("Seed: %d\n", Random);
srand48(Random);

每次我使用-r1234567我的程序段错误并说:

Program received signal SIGSEGV, Segmentation fault.
____strtol_l_internal (nptr=0x0, endptr=0x0, base=10, group=<optimized out>, 
loc=0x7ffff7ad8020) at ../stdlib/strtol_l.c:298
298 ../stdlib/strtol_l.c: No such file or directory.
(gdb) bt
#0  ____strtol_l_internal (nptr=0x0, endptr=0x0, base=10, group=<optimized out>, 
loc=0x7ffff7ad8020) at ../stdlib/strtol_l.c:298
#1  0x00007ffff77589e0 in atoi (nptr=<optimized out>) at atoi.c:28
#2  0x0000000000401d8c in getCommandLine (argc=6, argv=0x7fffffffe238)
at prog.c:171
#3  0x0000000000401514 in main (argc=6, argv=0x7fffffffe238) at prog.c:35
(gdb) up
#1  0x00007ffff77589e0 in atoi (nptr=<optimized out>) at atoi.c:28
28  atoi.c: No such file or directory.
(gdb) up
#2  0x0000000000401d8c in getCommandLine (argc=6, argv=0x7fffffffe238)
at prog.c:171
warning: Source file is more recent than executable.

在我的命令中:案例如下:

 while ((c = getopt(argc, argv, "g:n:a:h:s:d:v:r")) != -1)

case 'r': Random = atoi(optarg);       break;

因此,用户希望使用种子进行随机化。他们这样做./program -r1234567。然后进入上面提到的两行代码并且应该随机化。

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

您的问题是getopt调用,因为您忘记告诉getopt -r参数取值:

getopt(argc, argv, "g:n:a:h:s:d:v:r:")
/*                                 ^ */
/*                                 | */
/*                    Add colon here */

因此,当您致电optarg时,NULL指针为atoi

答案 1 :(得分:0)

你是从命令行给出-r1234567,你如何解析它并给它ato atoi?

如果atoi得到“1234567”作为它的参数那么应该没有任何问题..你能粘贴解析argv [1]的逻辑吗?

答案 2 :(得分:0)

将Random声明为int?。 srand48需要很长时间作为参数,所以你应该使用atol而不是atoi:

long Random = 42;
printf("Seed: %d\n", Random);
srand48(Random);

答案 3 :(得分:0)

问题是..你在参数r的末尾缺少“:”因为这个NULL被传递给atoi ..尝试在getopt !!的r末尾添加“:” / p>