代码之家  ›  专栏  ›  技术社区  ›  Yuvraj Singh Johrawanshi

代码崩溃导致错误分段错误(内核转储)

  •  -1
  • Yuvraj Singh Johrawanshi  · 技术社区  · 6 年前
    #include <stdio.h>
    #include <string.h>
    
    int NUM_ADS=7;
    char *ADS[]=
    {
        "William: SBM GSOH likes sports,TV,dining",
    
        "Matt:SWM NS likes art,movies,theater",``
    
        "Luis:SLM ND likes books,theater,art",
    
        "Mike:DWM DS likes trucks,sports and bieber"
    
        "Peter:SAM likes chess,working out and art",
    
        "Josh:SJM likes sports,movie theatre",
    
        "Jed:DBM likes theater,books and dining"
    };
    
    int sports_no_bieber(char *s)
    {
        return strstr(s,"sports")&&!strstr(s,"bieber");
    }
    
    int sports_or_workout(char *s)
    {
        return strstr(s,"sports")||strstr(s,"working out");
    }
    
    int ns_theater(char *s)
    {
        return strstr(s,"NS")&&strstr(s,"theater");
    }
    
    int arts_theater_or_dining(char *s
    {
        return strstr(s,"arts")||strstr(s,"theater")||strstr(s,"dining");
    }
    

    创建指向上面定义的函数的指针

    void find(int(*match)(char*))
    {
        int i;
    
        puts("Search Results:");
        puts("------------------------------------");
    
        for(i=0;i<NUM_ADS;i++)
        {
            if(match(ADS[i]))
            {
                printf("%s\n",ADS[i]);
            }
        }
    
        puts("----------------------------------");
    }
    

    并将这些指针作为参数传递给这些函数,我得到了错误分段错误

    int main()
    {
        find(sports_no_bieber);
        find(sports_or_workout);
        find(ns_theater);
        find(arts_theater_or_dining);
    
        return 0;    
    }
    

    我创建函数指针并将它们传递给另一个函数

    我在valgrind查过了

    Valgrind输出

    here is the output

    可执行输出

    output of code

    我正在使用ubuntu 17.04

    1 回复  |  直到 6 年前
        1
  •  4
  •   Craig Estey    6 年前

    在里面 ADS ,则“Mike”字符串 在末尾加一个逗号。因此,编译器将[静默地]将其与“Peter”字符串连接起来,以创建单个字符串。

    这缩短了 广告 按一个元素排列。结果是 广告 将只有6个元素,而不是您期望的7个元素。

    因此 for 循环输入 find 将超过阵列末端一个,导致segfault