c - 为什么以下带有字符串的代码在从函数调用时会生成总线错误?
问题描述
我已经想通了,但我想我可以把它贴在这里,以防它可以帮助别人。
所以我有这段代码,它从文件中读取任意数据并打印出它找到的第一个字符串(以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 它运行良好,但如果我尝试使用它,我会得到那个总线错误。该函数遵循我为另一个函数所做的类似设计,它可以在不从文件中读取任何内容的情况下执行类似的字符串工作。
解决方案
上述问题中的问题是下面调用的函数以 * 为前缀。
这导致返回的值被取消引用(这不是我的意图),返回值的取消引用导致仅返回一个字符,这在尝试与 printf 一起使用时导致总线错误,该 printf 期望以空终止的字符串但它只收到一个字符。
这个函数应该被调用的方式是没有*,如下所示。
char *string = read_string(obj_file, absoluteOffset, 1024);
printf(" The String: %s\n", string);
free(string);
推荐阅读
- c# - 使用 ASP.NET Core MVC 将带有文件的数据发布到 api (ASP.NET Core Web API)
- android - 在 Android 5.x 和 4.x w 上找不到证书路径的信任锚。让我们在服务器上加密
- go - golint 执行不返回任何内容
- wso2 - 如何在 API 3.0.0 和 BPS 中配置用户注册工作流程?
- haskell - 创建包含列表的数据类型并在其上定义函数
- redis - redisearch FT.SEARCH 的搜索复杂度?
- python - Python 3.8 下 mpmath 有问题,但在 2.7 下可以
- javascript - 如何在Javascript中的for循环中创建元素
- java - 如何使用 Boyer Moore 算法找到最合适的出现?
- php - 警告:使用未定义的常量 HTTP_USER_AGENT - 在第 1 行