【问题标题】:bsearch with array of pointer of structsbsearch 与结构指针数组
【发布时间】:2014-11-23 23:10:28
【问题描述】:

我有一个结构:

typedef struct entry_t {
  char * name;
  int lines [MAX];
  int n;/*n lines*/
} entry_t;

还有一个结构数组entry_t * list[MAX];

如果我的以下函数中存在条目,我会尝试使用 bsearch 获取条目:

int addToList(entry_t * list[], int n, const char * name, int lineNr){
  int i = 0;
  int j = 0;
  entry_t * entry;
  entry_t * sentry;
  bool found = false;
  char * tmp = (char*) malloc(sizeof(char)*MAX);

  sentry = (entry_t *) bsearch(name,list,n,sizeof(entry_t *), cmpEntries2);
    if(sentry != NULL){
        printf("%s",sentry->name);
      i = sentry->n;
      sentry->lines[i] = lineNr;
      sentry->n++;
    }
   else {
    sentry = (entry_t *) malloc(sizeof(entry_t));
    strcpy(tmp,name);
    sentry->name = tmp;
    sentry->lines[0] = lineNr;
    sentry->n = 1;
    list[n] = sentry;
    n++;
  }

  return n;
}

int cmpEntries2(const void * a, const void * b){
  assert (a != NULL);
  assert (b != NULL);
  printf("DB %s %s\n",(const char*)a,(*(entry_t **)b)->name );
  return strcmp( (const char*)a, (*(entry_t **)b)->name );
}

我的数据库日志

DB argc main
DB argv main
DB printf argc
DB printf argv
DB printf argc
DB printf argv
DB printf printf
0M:

奇怪的是,sentry 不为空,但 name 有点奇怪(随机内存位置)。

谢谢

【问题讨论】:

    标签: c pointers bsearch


    【解决方案1】:

    sentry(用于接收bsearch()的结果时)必须是struct entry_t **类型。

    【讨论】:

    • 如果你删除了 struct(typedef struct),你的答案是正确的,谢谢
    • 写作struct entry_t 和简单的entry_t 在你的代码中应该是相等的。但写struct 并避免typedef 通常是一种更好的风格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多