【问题标题】:Bus Error Using strsep()使用 strsep() 的总线错误
【发布时间】:2016-07-23 08:50:22
【问题描述】:

我正在尝试编写一系列函数,这些函数将文件名作为输入(例如 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);
}

这个程序的主要功能只是简单地调用 format() 并带有一个包含文件名的 char*:

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

        return 0;
}

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

编辑:添加主要功能代码

【问题讨论】:

  • The main function of this program simply calls format() with a char* containing a filename.:我们不在乎;我们需要代码。顺便说一句,strsep() 是邪恶而危险的巫术。你应该改用strtok()
  • 如果文件名是字符串文字,那么您可能无法写入它。这可能是总线错误的原因。
  • @KemyLand 添加了main() 代码
  • 改为char filename[] = "test.c";

标签: c memory bus-error strsep


【解决方案1】:

不保证字符串字面量的内存是可写的。

char filename[] = "test.c";

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

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

另外,get_ext 可以是:

return strsep(filename, ".");

并且sizeof(char) 被定义为 1(即 1 个字节 - 即使该字节不是 8 位大(罕见))。

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 2021-12-10
    • 2019-11-21
    • 2021-03-26
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多