首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bsearch和struct (自定义类型)

bsearch和struct (自定义类型)
EN

Stack Overflow用户
提问于 2012-02-08 06:29:53
回答 3查看 2.6K关注 0票数 3

我有一个这样的数组:

代码语言:javascript
复制
typedef struct INSTR
{
    char* str;
    int  argc;
} INSTR;
const static INSTR instructions[] = { {"blue",1}, {"green",2} };

然后我尝试执行bsearch,但收到了Segmentation fault消息:

代码语言:javascript
复制
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);
}

代码语言:javascript
复制
char *str = get_string(src_buff, size);
bsearch(str, instructions,
        sizeof(instructions) / sizeof(instructions[0]),
        sizeof(instructions[0]), comp);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-08 06:39:42

comp()函数是incorrect.From here

比较两个元素的

比较器函数。该函数应遵循以下原型:

代码语言:javascript
复制
int comparator ( const void * pkey, const void * pelem );

函数必须接受两个参数:第一个参数指向键对象,第二个参数指向数组的一个元素,这两个参数都被类型转换为void*。该函数应将参数转换回某种数据类型,并对它们进行比较。

comp()的第一个参数是const char*,而不是INSTR*

更改为:

代码语言:javascript
复制
int comp(const void *a, const void *b)
{
    const INSTR *bb = (INSTR*)b; 
    return strcmp((const char*)a, bb->str);
}

或者,将key更改为INSTR*而不是const char*

票数 3
EN

Stack Overflow用户

发布于 2012-02-08 06:38:33

您传递了一个名为str的变量作为键,但在比较函数中,您将其视为INSTR。如果您的键是一个字符串,那么a实际上应该是指向它的指针,并且您应该使用

代码语言:javascript
复制
return strcmp(a, bb->str);

这是基于str实际上是一个字符串的假设,但是如果不看到它的声明,我们就不能确定(我猜是的,除非你有一些非常不寻常的命名约定)。

编辑:

基于更新,它是一个字符串。

票数 3
EN

Stack Overflow用户

发布于 2012-02-08 06:39:47

comp函数的第一个参数将是作为第一个参数传递给bsearch的参数,而不是INSTR。您的比较函数应该相应地执行以下操作:

代码语言:javascript
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9185007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档