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

C 代码崩溃导致错误分段错误(内核转储),c,linux,ubuntu,segmentation-fault,function-pointers,C,Linux,Ubuntu,Segmentation Fault,Function Pointers,我正在创建函数指针并将它们传递给另一个函数 我在valgrind查过了 瓦尔研磨输出 可执行输出 我在ADS中使用的是ubuntu17.04,“Mike”字符串末尾没有逗号。因此,编译器将[静默地]将其与“Peter”字符串连接起来,以创建单个字符串 这将ADS数组缩短一个元素。结果是,ADS将只有6个元素,而不是您期望的7个元素 因此,find中的for循环将经过数组的末尾,导致segfaultahh,我错过了。谢谢你的帮助,现在一切都很好。 #include <stdio.h>

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

我在valgrind查过了

瓦尔研磨输出

可执行输出

我在
ADS
中使用的是ubuntu17.04

,“Mike”字符串末尾没有逗号。因此,编译器将[静默地]将其与“Peter”字符串连接起来,以创建单个字符串

这将
ADS
数组缩短一个元素。结果是,
ADS
将只有6个元素,而不是您期望的7个元素


因此,
find
中的
for
循环将经过数组的末尾,导致segfault

ahh,我错过了。谢谢你的帮助,现在一切都很好。
#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;    
}