2012-07-18 65 views
1

我在使用此代码访问lfind时遇到了分段错误。 CVector是一个名为elems的数组。我知道CVectorCreate和CVectorAppend函数可以工作。第一块是测试代码,它是作为类的一部分提供的,不能改变,第二块是我编写的函数调用。有人可以帮助我确定我的问题吗?谢谢!lfind的分割错误?

char *jumbled = "xatmpdvyhglzjrknicoqsbuewf"; 
CVector *cv = CVectorCreate(sizeof(char), 4, NULL); 
for (int i = 0; i < strlen(jumbled); i++) 
    CVectorAppend(cv, &jumbled[i]);      
printf("\nDoing linear searches on unsorted cvector.\n"); 
char ch = '*'; 
Verify(0, CVectorSearch(cv, &jumbled[0], CmpCharElem, 0, false), "Linear search"); 




int CVectorSearch(const CVector *cv, const void *key, CVectorCmpElemFn cmpfn, int startIndex, bool isSorted) 
{ 
    assert(startIndex >= 0 && startIndex <= cv->logicalLength); 
    void *found = NULL; 
    if (isSorted == true) { 
    found = bsearch(key, (char *)(cv->elems) + (startIndex * cv->elemSize), 
      cv->logicalLength, cv->elemSize, cmpfn); 
    } else { 
    found = lfind(key, (char *)(cv->elems) + (startIndex * cv->elemSize), cv->logicalLength, cv->elemSize, cmpfn); 
    } 
+1

'&混乱的[0]' - 只是通过在'jumbled',它已经是一个指针... – 2012-07-18 20:54:52

回答

1

bsearch不同,第三个参数来lfind是一个指针。

size_t nmemb = cv->logicalLength; 
found = lfind(key, (char *)(cv->elems) + (startIndex * cv->elemSize), 
       &nmemb, cv->elemSize, cmpfn); 
+0

说,就去掉了段错误的工作,非常感谢。另一个问题,如果您不介意使用相同的调用:elems被分配为长度为32的数组,但有26个填充元素。 Lfind似乎也会自动尝试将6个未初始化的值作为其搜索的一部分进行比较。我怎样才能阻止它做到这一点? – 2012-07-18 21:24:39

+0

@JasonBlock:你不应该对数组中的元素说谎。如果你知道你总是会有额外的,你可以在第27位写上你想找到的钥匙,这样即使它不在第26位,“寻找”也能找到它。 – jxh 2012-07-18 22:51:07