关于C和泛型函数
我想使用C泛型实现搜索关于C和泛型函数,c,generics,C,Generics,我想使用C泛型实现搜索 int lsearchGeneric(void *key, void *base, int n, int elemSize) { int i =0; for(; i < n; i++) { void *elemAddr = (char*) base + i * elemSize; if(memcmp(key, elemAddr , elemSize) == 0) {
int lsearchGeneric(void *key, void *base, int n, int elemSize)
{
int i =0;
for(; i < n; i++) {
void *elemAddr = (char*) base + i * elemSize;
if(memcmp(key, elemAddr , elemSize) == 0) {
return i;
}
}
return -1;
}
我想知道我在这里错过了什么。我希望是1而不是-1,因为“w”是“two”中的第二个字母
对于那些想知道这是否是家庭作业的人(你知道你是谁)来说,答案是“不,不是。我在遵循iTunesU的编程范例讲座”看起来你的函数调用中有一个额外的
&
:
int result = lsearchGeneric (&key, base, 3, sizeof(char));
^
does not belong here!
您传递的是指针的地址,而不是指针本身。这里的缺点是,您与两个操作数不一致:您传递了&key
和base
,一个带&
,另一个不带&
小音符:
此“通用”可能无法正常使用。由于填充值未指定,并且可能与其他相同结构不同。如果在调试器中单步执行此操作,首先会注意到函数中“key”的值不是“w”,而是一些垃圾。如果你仔细看,你会注意到地址与你在主程序中签出时的地址也不一样
这是因为调用函数时使用的是键值指针的地址--
&key
--而不是键值本身的地址,即key
。删除多余的&
,它就正常工作了。我一想到它,你就发布了这个帖子:)谢谢你,实际上,你关于编译器警告的评论是错误的,因为函数使用了无效*
。(将char**
强制转换为void*
是完全有效的,所以这在技术上都是合法的代码。)这就是为什么在C中使用像这样的“泛型”是危险的@布鲁克斯假设你是对的,我认为函数参数是char*
,而不是void*
。。。正在修复…您是否尝试过在调试器中单步执行程序?考虑到你这样做是为了学习,你会从中学到更多,而不是从这里的答案中….+1来纠正我的错误并指向使用调试器。
int result = lsearchGeneric (&key, base, 3, sizeof(char));
^
does not belong here!