我有一个这样的数组:
typedef struct INSTR
{
char* str;
int argc;
} INSTR;
const static INSTR instructions[] = { {"blue",1}, {"green",2} };
然后我尝试了bsearch
,但我收到Segmentation fault
消息:
int comp(const void *a, const void *b)
{
const INSTR *aa = (INSTR*)a;
const INSTR *bb = (INSTR*)b;
// if I "return 0;" here i get no error.
return strcmp(aa->str, bb->str);
}
char *str = get_string(src_buff, size);
bsearch(str, instructions,
sizeof(instructions) / sizeof(instructions[0]),
sizeof(instructions[0]), comp);
答案 0 :(得分:3)
您传递的是名为str
的变量作为您的键,但在比较函数中,您将其视为INSTR
。如果你的密钥是一个字符串,那么a
实际上应该是指向它的指针,你应该使用
return strcmp(a, bb->str);
这是基于str
实际上是一个字符串的假设,但我们不能确定没有看到它声明(我猜它是除非你有一些相当不寻常的命名约定)。
编辑:
根据更新, 是一个字符串。
答案 1 :(得分:3)
comp()
功能不正确。来自here:
比较 比较两个元素的函数。该功能应遵循以下原型:
int comparator ( const void * pkey, const void * pelem );
The function must accept two parameters: the first one pointing to the key object, and the second one to an element of the array, both type-casted as void*. The function should cast the parameters back to some data type and compare them.
comp()
的第一个参数是const char*
,而不是INSTR*
。
更改为:
int comp(const void *a, const void *b)
{
const INSTR *bb = (INSTR*)b;
return strcmp((const char*)a, bb->str);
}
或者,将key
更改为INSTR*
而不是const char*
。
答案 2 :(得分:2)
comp
函数的第一个参数将是您作为bsearch
的第一个参数传递的参数,而不是INSTR
。您的比较函数应该采取相应的行动:
int comp(const void *a, const void *b)
{
const char* str = (const char*)a;
const INSTR *bb = (INSTR*)b;
// if I "return 0;" here i get no error.
return strcmp(str, bb->str);
}