首页 > 解决方案 > 为什么以下带有字符串的代码在从函数调用时会生成总线错误?

问题描述

我已经想通了,但我想我可以把它贴在这里,以防它可以帮助别人。

所以我有这段代码,它从文件中读取任意数据并打印出它找到的第一个字符串(以null结尾)。如果我直接在函数中使用代码,它似乎工作正常,但如果我在捕获返回值后使用字符串,返回字符串似乎总是会导致总线错误。

static char *read_string(FILE *obj_file, off_t offset, size_t size) {
char *strraw = load_bytes(obj_file, offset, size);
char* str = malloc(size);
strcpy(str, "");
for (int i = 0; i < size; i++) {
    if (strraw[i] == '\0') {
        strncpy(str, strraw, i + 1);
        break;
    }
}
free(strraw);
return str;

}

别处:

char *string = *read_string(obj_file, absoluteOffset, 1024);
printf("  The String: %s\n", string);
free(string);

如果我注释掉 printf 它运行良好,但如果我尝试使用它,我会得到那个总线错误。该函数遵循我为另一个函数所做的类似设计,它可以在不从文件中读取任何内容的情况下执行类似的字符串工作。

标签: cstringruntime-error

解决方案


上述问题中的问题是下面调用的函数以 * 为前缀。

这导致返回的值被取消引用(这不是我的意图),返回值的取消引用导致仅返回一个字符,这在尝试与 printf 一起使用时导致总线错误,该 printf 期望以空终止的字符串但它只收到一个字符。

这个函数应该被调用的方式是没有*,如下所示。

char *string = read_string(obj_file, absoluteOffset, 1024);
printf("  The String: %s\n", string);
free(string);

推荐阅读