关于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) {

我想使用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) {
            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!