关于C和泛型函数

时间:2012-01-06 04:47:03

标签: c generics

我想使用C generics实现搜索

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;
}

使用

调用此函数
char *key = strdup("w");
char *base = strdup("two");

int result = lsearchGeneric (&key, base, 3, sizeof(char));
printf("Position: %d\n", result); // prints -1

我想知道我在这里失踪了什么。而不是-1,我会期望1,因为“w”是“两个”中的第二个字母

对于那些(你知道你是谁)谁想知道这是否是家庭作业 - 答案是“不,不是。我正在关注iTunesU的编程范例讲座”

2 个答案:

答案 0 :(得分:4)

您的函数调用中似乎有额外的&

int result = lsearchGeneric (&key, base, 3, sizeof(char));
                             ^
                        does not belong here!

您传递指针的地址而不是指针本身。这里的赠品是你与两个操作数不一致:你通过了&keybase,一个没有&,另一个没有{{1}}。

小注:

此“通用”可能无法与structs that have padding一起使用。由于填充值未指定,并且可能与其他相同的结构不同。

答案 1 :(得分:2)

如果你在调试器中逐步执行此操作,首先要注意的是函数内部的“key”值不是“w” - 相反,它是一些垃圾。如果你仔细观察,你会注意到地址与在主程序中检查时的地址不同。

原因是您使用键值的指针地址&key调用函数 - 而不是键值本身的地址,即key 。删除无关的&,它可以正常工作。