【发布时间】:2018-02-27 18:27:08
【问题描述】:
compareStrings 将比较两个字符串。当 void 指针转换为 char 指针时,下面的代码可以正常工作。
int compareStrings(void *value1, void *value2) {
const char *str1, *str2;
str1 = (char *)value1;
str2 = (char *)value2;
return strcmp(str1, str2);
}
但是,当我将类型转换为指向 char 的指针时,代码会转储分段错误错误,我认为这是合理的,它不应该。
int compareStrings(void *value1, void *value2) {
const char **str1, **str2;
str1 = (char **)value1;
str2 = (char **)value2;
return strcmp(*str1, *str2);
}
谁能解释第二个函数的问题?
更新:
完整代码为:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int compare(void *value1, void *value2);
int binarySearch(void **array, int size, void *value,
int(*compareFunc)(void *, void *));
int compareStrings(void *value1, void *value2);
int binarySearch(void **array, int size, void *value,
int(*compareFunc)(void *, void *)) {
int low, mid, high, compareResult;
low = 0;
high = size;
while (low < high) {
mid = low + ((high - low) / 2);
compareResult = (*compareFunc)(array[mid], value);
if (compareResult < 0) {
low = mid + 1;
} else {
high = mid;
}
}
return low;
}
int compareStrings(void *value1, void *value2) {
const char *str1, *str2;
str1 = (char *)value1;
str2 = (char *)value2;
return strcmp(str1, str2);
}
int main() {
int nElements, maxStringLen, index;
char **stringArray;
char *sToFind;
nElements = 10;
maxStringLen = 100;
sToFind = NULL;
stringArray = malloc(sizeof(char *) * nElements);
for (int i = 0; i < nElements; i++) {
stringArray[i] = malloc(sizeof(char) * maxStringLen);
sprintf(stringArray[i], "sample%d", i+1);
}
sToFind = "sample3";
index = binarySearch((void **)stringArray, nElements, sToFind, compareStrings);
if (index >= nElements) {
printf ("ERROR: value %s not found at index %d\n", sToFind, index);
}else{
printf("item found at index %d!\n", index);
}
for(int i = 0; i < nElements; i++) {
free(stringArray[i]);
}
free(stringArray);
return 0;
}
【问题讨论】:
-
如果你没有在两个实现之间改变调用者代码,那显然是行不通的。
-
你想做什么?原型看起来像是被
bsearch或qsort调用的东西(但它们应该有const void*参数,所以...),但是没有原始调用站点就无法调试。 -
这完全取决于如何调用这个函数。请使用minimal reproducible example 更新您的问题。我怀疑您将它用作
qsort函数的回调函数,因此请特别说明您的列表是如何设置的以及如何调用qsort。 -
这看起来可能是 How to
qsort()an array of pointers tocharin C? 的副本——或者,至少,它提供了可以帮助您的信息。您的第一个比较器适用于对字符串中的字符进行排序;第二个适用于对指向字符串的指针数组进行排序。对qsort()的调用不同,就像比较器不同一样。 -
如果你知道你有 char 指针,为什么要把它们作为 void 指针传递?这只会让事情更难理解,更容易出错,这意味着编译器无法帮助你发现错误。 (除非,正如其他人推测的那样,您在指针数组上使用
qsort。)
标签: c pointers segmentation-fault