程序接收信号SIGSEGV,分段故障错误

时间:2013-09-21 15:57:36

标签: c segmentation-fault sigsegv

编程接收信号SIGSEGV,分段故障

在线上:if(argv [1] [0] ==' - ')。

当我在unix shell中看到'-c'标志时,我试图让它做一些事情

int main(int argc, char **argv)
    {

    int target_column=1;
    int column_flag=0;
    int descending_flag=0;

    /* command-line argument control */
        printf("Argument(s) detected(%d)\n", argc);

        /* default mode */
        if (argc = 3)
        {
    if (argv[1][0] == '-')
             {
                 /* column flag */
                 if (argv[1][1] == 'c')
                 {
                     column_flag=1;
                     printf("column flag found, ");
                 }
                 /* error checking */
                 else
                 {
                     fprintf(stderr, "tsort -c <column> [-d]\n");
                     exit(EXIT_FAILURE);
                 }
             }

很多感谢您的回答。这绝对是小错字。

3 个答案:

答案 0 :(得分:4)

如果要使用==检查参数的数量:

if (argc = 3)   // This assigns 3 to argc and always yields true
{
    if (argv[1][0] == '-')

应该是

if (argc == 3)
{
    if (argv[1][0] == '-')

编译器应该警告你这件事。如果没有,请始终使用-Wall -Wextra进行编译以避免这种情况。

答案 1 :(得分:3)

您的代码中有拼写错误:

if (argc = 3)

应该是:

if (argc == 3)

人们经常将常量放在左边以避免这种类型的错误,例如:

if(3 = argc)

无法编译,因为无法将常量赋值给。

答案 2 :(得分:1)

您可以在此行中将argc的值更改为3:

if (argc = 3)

应该是:

if (argc == 3)

这有效(编译器不会给出错误消息)因为赋值在C ++中有返回值。在这种情况下,该值为3,其值为true。因此,您将始终尝试访问第一个查找“ - ”的参数,该参数可能不存在。这导致了段错误。