2012-07-18 66 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