调用自制C函数时出现分段错误

时间:2018-06-20 07:49:13

标签: c function parameters segmentation-fault

#include <string.h>
#include <time.h>
#include <stdio.h>

static char* extensionSearch(char * fileName){
    const char* extensions[] = {".exe", ".doc", ".xls", ".ppt", ".txt", ".jpg", ".eml", ".log"};

    char * fName = fileName;
    char* tmpRetValue = "";
    char* finalRetValue = "noExt";
    for(int i=0; i<sizeof(extensions)/sizeof(const char *); i ++)
    {
        tmpRetValue = strstr(fName, extensions[i]);
        if(strcmp(tmpRetValue, extensions[i]) == 0)
        {
            finalRetValue = extensions[i];
        }


    }
    return finalRetValue;
}

int main () {
    char* fileExt = extensionSearch("great.exe");
}

这是一个自制的C函数。我叫

这会导致分段错误。 发生段错误的原因是strstr()返回NULL,但是当我阅读文档“ https://www.tutorialspoint.com/c_standard_library/c_function_strstr.htm”时,它从不返回NULL。为什么它返回NULL?

该函数获取文件名,并检查它是否在函数中具有这些扩展名之一。如果有,则返回文件扩展名。

2 个答案:

答案 0 :(得分:1)

问题最有可能在这里

printf("%s\n", *fileName);

变量fileName是指向char的指针。仅使用"%s"格式打印字符串时所需的类型。但是,您取消引用了指针,这导致将字符串中的第一个字符传递为"%s"格式。表达式*fileNamefileName[0]相同。这是一个char元素。

格式说明符和参数不匹配会导致undefined behavior,这是导致像您这样的崩溃的常见原因。

答案 1 :(得分:1)

您必须检查@click调用的返回值。如果strstr返回NULL,则不能将其传递给strstr。您需要做例如

strcmp