【问题标题】:Segmentation Fault Using bsearch in C在 C 中使用 bsearch 的分段错误
【发布时间】:2013-12-15 21:23:22
【问题描述】:
player_t* getFirstMatch(player_t** sortedPlayers, int playerCount, char* inputString)
{
   player_t searchPlayer;
   player_t* searchPlayerPointer = &searchPlayer;

   searchPlayer.nameLast = inputString;

   searchPlayerPointer = (player_t*) bsearch(searchPlayerPointer, 
      *sortedPlayers, playerCount, sizeof(player_t*), 
      playerCompareLast);

   return searchPlayerPointer;
}

我的程序在使用 bsearch() 的行上出现分段错误。我在这里做错了什么?这是我的比较功能。我在 qsort 中使用了类似的版本,但现在我需要在 bsearch 中使用这个版本:

int playerCompareLast(const void *p1, const void *p2)
{
  char* nameLast1;
  char* nameLast2;

  int result;

  nameLast1 = (*(player_t **)p1)->nameLast;
  nameLast2 = (*(player_t **)p2)->nameLast;

  result = strcmp(nameLast1, nameLast2);

  return result; 
}

player_t 类型只是一个包含一堆不同成员(如 nameLast、nameFirst 等)的 Struct。我无法弄清楚我的 bsearch() 参数有什么问题!

【问题讨论】:

  • 正在进行大量类型转换。
  • getFirstMatch 是如何被调用的?你真的需要检查空指针。
  • 为什么p1p2 是指向指针类型的指针?不应该将p1p2 都转换为player_t * 类型吗?

标签: c pointers fault bsearch


【解决方案1】:

您正在尝试使用bsearch 来搜索指针数组,显然:base 参数是player_t**size 参数是sizeof(player_t*)playerCompare 的实现似乎与此匹配,因为它将 p 转换为 player_t**

唉,您将密钥传递为player_t*,而不是player_t**。要匹配playerCompare 的行为,您应该通过&playerPointer(即player_t**)。

我预计访问冲突/段错误会发生在由bsearch 调用的playerCompare 中(包括从playerCompare 调用的strcmp),快速检查转储或查看调试器中的堆栈提升它应该确认。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    相关资源
    最近更新 更多