可能只是 C 新手的另一个愚蠢的指针问题。虽然想不通这个。似乎不知何故我的堆栈帧已损坏。分配似乎无关紧要,但它是一个相当基本的 I/O 练习。尝试通过单次读取读取结构数组(不能使用高级 I/O 函数,例如 fread())。
#include "A2_Phase2.h"
void read_directory(Cdir directory[], int cnt)
{
int fd;
char filename[] = "RandomStructDir.bin";
fd = open(filename, O_RDONLY, S_IRWXU);
if (fd < 0)
perror(strcat(filename, " failed to open."));
if (read(fd, &(directory[0].code[0]), sizeof(Cdir) * cnt) < 0) {
perror(strcat(filename, " could not be accessed."));
}
close(fd);
}
int binary_search(Cdir directory[], char *key, int l, int r) {
int mid = (int) r / 2;
if (strncmp(key, directory[mid].code, 3) < 0)
return binary_search(directory, key, l, mid - 1);
else if (strncmp(key, directory[mid].code, 3) > 0)
return binary_search(directory, key, mid + 1, r);
else
return mid;
}
int main(int argc, char *argv[])
{
int COUNTRY_COUNT = atoi(argv[1]);
printf("%d", COUNTRY_COUNT);
Cdir *directory = (Cdir *) malloc(sizeof(Cdir) * COUNTRY_COUNT);
read_directory(directory, COUNTRY_COUNT);
binary_search(directory, "ZWE", 0, 238);
free(directory);
}
Run Code Online (Sandbox Code Playgroud)
我通过 GDB 收到此错误:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400940 in binary_search (
directory=<error reading variable: Cannot access memory at address 0x7fffff7feff8>,
key=<error reading variable: Cannot access memory at address 0x7fffff7feff0>, l=<error reading variable: Cannot access memory at address 0x7fffff7fefec>,
r=<error reading variable: Cannot access memory at address 0x7fffff7fefe8>)
at A2_Phase2.c:19
19 int binary_search(Cdir directory[], char *key, int l, int r) {
Run Code Online (Sandbox Code Playgroud)
谢谢!
int COUNTRY_COUNT = atoi(argv[1]);
Run Code Online (Sandbox Code Playgroud)
读取国家数量作为程序的参数,但您稍后硬编码假设这是>= 238
当您调用
binary_search(directory, "ZWE", 0, 238);
Run Code Online (Sandbox Code Playgroud)
你能试一下吗
binary_search(directory, "ZWE", 0, COUNTRY_COUNT-1);
Run Code Online (Sandbox Code Playgroud)
反而?您的binary_search
函数中还有一些错误可以重写为
int binary_search(Cdir directory[], const char *key, int l, int r)
{
int mid = (r + l) / 2;
int cmp = strncmp(key, directory[mid].code, 3);
if (l >= r) {
if (cmp == 0)
return l;
return -1;
}
if (cmp < 0)
return binary_search(directory, key, l, mid - 1);
else if (cmp > 0)
return binary_search(directory, key, mid + 1, r);
else
return mid;
}
Run Code Online (Sandbox Code Playgroud)
主要的变化是
mid
考虑l
以及r
strcmp
。非常小,但它使我的代码更清晰,并将提高搜索性能不太重要的是,有一些风格问题使您的代码难以阅读
COUNTRY_COUNT
对变量使用大写(例如)是不常见的。所有大写通常非正式地保留用于使用小写或驼峰命名的变量定义