为什么以下带有字符串的代码在从函数调用时会产生总线错误?
Why is the following code with strings generating a bus error when called from a function?
我已经解决了这个问题,但我想我可以 post 把它放在这里,以防它对其他人有帮助。
所以我有这段代码,它从文件中读取任意数据并打印出它找到的第一个字符串(以空结尾)。如果我直接在函数中使用代码,它似乎工作正常,但如果我在捕获 return 值后使用字符串,returning 字符串似乎总是导致总线错误。
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] == '[=10=]') {
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 一起使用时导致总线错误期望一个以空字符结尾的字符串,但它只收到一个字符。
调用此函数的方式应该是没有 *,如下所示。
char *string = read_string(obj_file, absoluteOffset, 1024);
printf(" The String: %s\n", string);
free(string);
我已经解决了这个问题,但我想我可以 post 把它放在这里,以防它对其他人有帮助。
所以我有这段代码,它从文件中读取任意数据并打印出它找到的第一个字符串(以空结尾)。如果我直接在函数中使用代码,它似乎工作正常,但如果我在捕获 return 值后使用字符串,returning 字符串似乎总是导致总线错误。
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] == '[=10=]') {
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 一起使用时导致总线错误期望一个以空字符结尾的字符串,但它只收到一个字符。
调用此函数的方式应该是没有 *,如下所示。
char *string = read_string(obj_file, absoluteOffset, 1024);
printf(" The String: %s\n", string);
free(string);