bsearch和struct(自定义类型)

时间:2012-02-07 22:29:53

标签: c pointers bsearch

我有一个这样的数组:

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);

3 个答案:

答案 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);
}