使用strsep()的总线错误

时间:2016-04-03 22:30:53

标签: c memory bus-error strsep

我正在尝试编写一系列将文件名作为输入的函数(例如main.c),并使用strsep()返回文件扩展名。当我运行程序时,无论何时调用strsep函数,都会出现总线错误。这是代码:

static char *get_extn(char **filename)
{
        char *delim = ".";
        strsep(filename, delim);

        return *filename;
}

void format(char *filename)
{
        char *extn = malloc(256 * sizeof(char));

        strncpy(extn, get_extn(&filename), 256);
        printf("extn: %s\n", extn);
}

该程序的主要功能只是使用包含文件名的char *调用format():

int main(int argc, char *argv[])
{
        char *filename = "test.c";
        format(filename);

        return 0;
}

我不确定为什么这个程序在执行时会导致总线错误。提前感谢您提供的任何帮助。

编辑:添加了主要功能代码

1 个答案:

答案 0 :(得分:1)

字符串文字的记忆不能保证可写。

char filename[] = "test.c";

改为创建一个可写的char数组。

在我的系统上,此内存受保护为只读,并尝试违反此保护会生成段错误。

此外,get_ext可以简单地为:

return strsep(filename, ".");

sizeof(char)被定义为1(即使该字节不是8位大(稀少),也是1个字节)。