我有一个这样的数组:
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);发布于 2012-02-08 06:39:42
comp()函数是incorrect.From here
比较两个元素的
比较器函数。该函数应遵循以下原型:
int comparator ( const void * pkey, const void * pelem );函数必须接受两个参数:第一个参数指向键对象,第二个参数指向数组的一个元素,这两个参数都被类型转换为void*。该函数应将参数转换回某种数据类型,并对它们进行比较。
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*。
发布于 2012-02-08 06:38:33
您传递了一个名为str的变量作为键,但在比较函数中,您将其视为INSTR。如果您的键是一个字符串,那么a实际上应该是指向它的指针,并且您应该使用
return strcmp(a, bb->str);这是基于str实际上是一个字符串的假设,但是如果不看到它的声明,我们就不能确定(我猜是的,除非你有一些非常不寻常的命名约定)。
编辑:
基于更新,它是一个字符串。
发布于 2012-02-08 06:39:47
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);
}https://stackoverflow.com/questions/9185007
复制相似问题