C lfind的分段错误?
我在lfind调用中得到了一个分段错误。CVector是一个结构,带有一个名为elems的数组。我知道CVectorCreate和CVectorAppend函数可以工作。第一块是测试代码,它是作为类的一部分提供的,不能更改,第二块是我编写的函数调用。有人能帮我确定我的问题吗?谢谢C lfind的分段错误?,c,C,我在lfind调用中得到了一个分段错误。CVector是一个结构,带有一个名为elems的数组。我知道CVectorCreate和CVectorAppend函数可以工作。第一块是测试代码,它是作为类的一部分提供的,不能更改,第二块是我编写的函数调用。有人能帮我确定我的问题吗?谢谢 char *jumbled = "xatmpdvyhglzjrknicoqsbuewf"; CVector *cv = CVectorCreate(sizeof(char), 4, NULL); for (int
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);
}
char*jumbled=“xatmpdvyhglzjrknicoqsbuewf”;
CVector*cv=CVectorCreate(sizeof(char),4,NULL);
for(int i=0;i=0&&startIndex logicalLength);
void*found=NULL;
如果(isSorted==true){
found=b搜索(键,(字符*)(cv->elems)+(startIndex*cv->elemSize),
cv->logicalLength,cv->elemSize,cmpfn);
}否则{
found=lfind(键,(字符*)(cv->elems)+(开始索引*cv->elemSize),cv->logicalLength,cv->elemSize,cmpfn);
}
与b搜索
不同,lfind
的第三个参数是指针
size_t nmemb = cv->logicalLength;
found = lfind(key, (char *)(cv->elems) + (startIndex * cv->elemSize),
&nmemb, cv->elemSize, cmpfn);
与
bsearch
不同,lfind
的第三个参数是指针
size_t nmemb = cv->logicalLength;
found = lfind(key, (char *)(cv->elems) + (startIndex * cv->elemSize),
&nmemb, cv->elemSize, cmpfn);
&jumbled[0]
-只需传入jumbled
,它已经是一个指针…&jumbled[0]
-只需传入jumbled
,它已经是一个指针了…可以删除segfault,非常感谢。如果您不介意相同的调用,另一个问题是:此时元素被分配为长度为32的数组,但有26个填充元素。Lfind似乎会自动尝试比较6个未初始化的值作为其搜索的一部分。我如何阻止它这样做?@JasonBlock:你不应该对lfind
撒谎说数组中有多少个元素。如果你知道你总是有多余的元素,你可以将你想要找到的键写在第27位,这样lfind
就可以找到它,即使它不在前26位。这很有效s至于删除segfault,非常感谢。如果您不介意的话,还有一个问题:elems此时被分配为长度为32的数组,但有26个填充元素。Lfind似乎也会自动尝试比较6个未初始化的值作为其搜索的一部分。我如何阻止它这样做?@JasonBlock:you sh不要谎称数组中有多少个元素。如果你知道你总是有多余的元素,你可以把你想找到的键写在第27位,这样lfind
就能找到它,即使它不在前26位。