代码崩溃给出错误分段错误(核心转储)

时间:2018-03-26 16:50:31

标签: c linux ubuntu segmentation-fault function-pointers

#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 个答案:

答案 0 :(得分:4)

ADS中,“Mike”字符串在结尾处有逗号。因此,编译器将[静默]将其与“Peter”字符串连接以创建单个字符串。

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

因此,for中的find循环将超过数组末尾,导致段错误