使用C中的bsearch进行分段错误

时间:2013-12-15 21:23:22

标签: c pointers fault bsearch

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等)。我无法弄清楚我的bsearch()参数有什么问题!

1 个答案:

答案 0 :(得分:3)

您正试图使用​​bsearch来搜索指针数组,显然:base参数为player_t**size参数为sizeof(player_t*)playerCompare的实施似乎与此相符,因为它将p转换为player_t**

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

我希望在playerCompare调用的bsearch中发生访问冲突/ seg错误(包括从strcmp调用的playerCompare),快速检查转储或者查看堆栈中的调试器,它应该确认。