帮助解决功能中的分段错误

时间:2010-02-21 20:22:03

标签: c segmentation-fault qsort

我一直试图解决这个bsearch作业问题一段时间了。我尝试使用我的代码首先搜索一个条目,如下所示:

int Compare(const void *a, const void *b);

void SortStudents(char *studentList[], size_t studentCount) 
{
    qsort(studentList, studentCount, sizeof(studentList[0]), Compare);
}

int Compare(const void *a, const void *b) 
{
    return (strcmp(*(char **)a, *(char **)b));
}

char *SearchList(char *key, char *list[], size_t num) 
{
    char **value = bsearch(&key, list, num, sizeof(list[0]), Compare);
    return (value == 0 ? 0 : *value);
}

/*Determines which registrants did not attend the first meeting by searching for registrants 
 that are not in attendees set. */
void DisplayClassStatus(
                        const char *registrants[], size_t registrantCount,
                        const char *attendees[],   size_t attendeeCount)
{
    char *missedFirstMeeting = SearchList((char *)registrants[0], (char **)attendees, attendeeCount);
}

我的missFirstMeeting似乎可以正常调用单个值,但是当我尝试在循环中重复调用我的SearchList函数时,这样:

for (int i = 0; i < attendeeCount; i++) {
    *missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}

我收到了分段错误错误。对我来说,似乎我在做同样的事情,但只是反复调用SearchList(),但显然有些错误,我没有看到,因为我得到了分段错误。有任何想法吗?感谢。

5 个答案:

答案 0 :(得分:2)

删除firstMeeting的前导'*':

missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);

答案 1 :(得分:1)

好的,所以问题如下,你迭代registrants,但是当它被截获attendeeCount项时你的停止。而且,如果missedFirstMeeting是char *,就像tur1ng所说的那样,你需要删除前导*。所以这样做:

for (int i = 0; i < registrantCount; i++) {
    missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
    /* Code that uses missedFirstMeeting here */
}

编辑: 如果您想保留所有SearchList返回值,那么您应该执行以下操作:

char** missedFirstMeething = malloc(sizeof(char*)*registrantCount);
for (int i = 0; i < registrantCount; i++) {
    missedFirstMeeting[i] = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
}

当然,在使用missedFirstMeeting之后,你应该释放分配的内存。

答案 2 :(得分:0)

好的,您需要将返回值函数放入变量中。我写C ++是为了谋生,我的老板永远不会接受这样的代码。这段代码很难阅读,甚至更难调试。原因是因为您可以为变量设置监视。您还可以看到当您逐行浏览程序时程序是如何链接的。调试器将列出名称空间中的所有变量及其对应的值。我打赌钱,当你重写这个更具可读性时,你会发现自己的问题。

答案 3 :(得分:0)

我在代码中看到(至少)两个问题。

首先,琐碎而严肃的是for循环应该比较i与registrantCount而不是attendeeCount

应该写第二个Compare():

int Compare(const void *a, const void *b) 
{
    return (strcmp((char *)a, *(char *)b));
}

你只需要将void指针强制转换为char指针。修复这些应修复您的SegFault错误。

已添加: for循环中missedFirstMeeting的解除引用是两个主要问题之一。

  for (i = 0; i < registrantCount; i++) {
      missedFirstMeeting = SearchList((char *)registrants[i], (char **)attendees, attendeeCount);
  }

指针转换很难阅读。

答案 4 :(得分:0)

问题是虽然计算机可变内存的大块,但这并不是编程时想象它们的最佳方式。你以这种方式对计算机进行了建模,但它并没有完全解决。