【问题标题】:Bus Error: 10 in C总线错误:C 中的 10
【发布时间】:2026-02-23 14:15:02
【问题描述】:

我的代码编译得很好,但是当我运行它时出现总线错误:10

void backupf(char *namelist, char *dirname)
{  
char    *in_filename;
char    *out_filename;
char    line[MAXPATHLEN];

FILE    *filenames = fopen(namelist, "r");

if(filenames == NULL) 
    {
        fprintf(stderr, "Cannot Open File\n");
        exit(EXIT_FAILURE);
    }
while( fgets(line, sizeof line, filenames) != NULL )
    {
    sprintf(in_filename, "./%s\n", line);
    sprintf(out_filename, "%s/%s\n", dirname, line);
    }
    backup(dirname, in_filename, out_filename);
fclose(filenames);
}

它应该采用带有文件名列表的文本文件参数,然后使用该信息使用我编写的备份函数将其备份到备份目录。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读About 页面。 backup() 发生崩溃是不是因为你没有正确检查它使用的文件是否打开成功?您应该说明发生了什么,并且您应该能够使用足够多的调试器来获取堆栈跟踪,以便您可以判断它在哪个函数中崩溃(即使您不能用它做任何其他事情)。您真的不想在文件名中添加换行符;您可能需要删除fgets() 在它读取的数据上留下的换行符。并且学习如何使用打印语句来找出发生了什么也很重要。
  • 我知道它在 fgets() 函数中崩溃了,备份功能很好
  • 奇怪...这往往意味着您在此代码调用的函数之一中存在缓冲区溢出。同样奇怪的是你没有在循环中调用backup;您只尝试保存从文件中读取的姓氏。目前尚不清楚为什么您的 backup() 函数需要 dirname 参数。
  • 我尝试在循环中调用备份并得到相同的结果,所以我想我会将文本行传递给一个单独的变量并尝试从循环外部调用它。备份函数打开备份文件,然后将 in_filename 复制到备份目录中。
  • “我知道它在 fgets() 函数中崩溃,备份函数很好” 这应该是可以重现的,没有代码示例中的 backup() 调用(它是,因为你是写入指针中的不确定地址)。

标签: c backup bus-error


【解决方案1】:

您没有为文件名分配空间;你应该。你正在写不确定的记忆。这可能会更好:

void backupf(char *namelist, char *dirname)
{  
    char  in_filename[MAXPATHLEN];
    char  out_filename[MAXPATHLEN];
    char  line[MAXPATHLEN]; 
    FILE *filenames = fopen(namelist, "r");

    if (filenames == NULL) 
    {
        fprintf(stderr, "Cannot Open File\n");
        exit(EXIT_FAILURE);
    }
    while (fgets(line, sizeof(line), filenames) != NULL)
    {
        snprintf(in_filename, sizeof(in_filename)"./%s\n", line);
        snprintf(out_filename, sizeof(out_filename), "%s/%s\n", dirname, line);
        backup(dirname, in_filename, out_filename);
    }
    fclose(filenames);
}

【讨论】:

  • @Jonathan:您能否帮助了解此代码是如何导致 BUS 错误的。我理解发生在未对齐的访问上。我在这里看不到任何这样的事情。为什么不为此设置段错误?
  • 不清楚,但有可能你踩到了文件指针中的值,所以它现在指向一个奇怪的地址,这会触发总线错误。
  • 啊奇怪。如果问题是它为什么给出分段错误,那将是一个单词的答案。